You've already forked linux-packaging-mono
Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
This commit is contained in:
parent
e9207cf623
commit
ef583813eb
1
external/llvm/lib/Target/X86/CMakeLists.txt
vendored
1
external/llvm/lib/Target/X86/CMakeLists.txt
vendored
@@ -31,6 +31,7 @@ set(sources
|
||||
X86FixupBWInsts.cpp
|
||||
X86FixupLEAs.cpp
|
||||
X86FixupSetCC.cpp
|
||||
X86FlagsCopyLowering.cpp
|
||||
X86FloatingPoint.cpp
|
||||
X86FrameLowering.cpp
|
||||
X86InstructionSelector.cpp
|
||||
|
@@ -265,13 +265,10 @@ MCDisassembler::DecodeStatus X86GenericDisassembler::getInstruction(
|
||||
/// @param reg - The Reg to append.
|
||||
static void translateRegister(MCInst &mcInst, Reg reg) {
|
||||
#define ENTRY(x) X86::x,
|
||||
uint8_t llvmRegnums[] = {
|
||||
ALL_REGS
|
||||
0
|
||||
};
|
||||
static constexpr MCPhysReg llvmRegnums[] = {ALL_REGS};
|
||||
#undef ENTRY
|
||||
|
||||
uint8_t llvmRegnum = llvmRegnums[reg];
|
||||
MCPhysReg llvmRegnum = llvmRegnums[reg];
|
||||
mcInst.addOperand(MCOperand::createReg(llvmRegnum));
|
||||
}
|
||||
|
||||
|
3
external/llvm/lib/Target/X86/X86.h
vendored
3
external/llvm/lib/Target/X86/X86.h
vendored
@@ -66,6 +66,9 @@ FunctionPass *createX86OptimizeLEAs();
|
||||
/// Return a pass that transforms setcc + movzx pairs into xor + setcc.
|
||||
FunctionPass *createX86FixupSetCC();
|
||||
|
||||
/// Return a pass that lowers EFLAGS copy pseudo instructions.
|
||||
FunctionPass *createX86FlagsCopyLoweringPass();
|
||||
|
||||
/// Return a pass that expands WinAlloca pseudo-instructions.
|
||||
FunctionPass *createX86WinAllocaExpander();
|
||||
|
||||
|
@@ -26,6 +26,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/TargetRegisterInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/Printable.h"
|
||||
#include <bitset>
|
||||
|
||||
using namespace llvm;
|
||||
@@ -262,25 +263,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// An Instruction Converter which completely deletes an instruction.
|
||||
/// For example, IMPLICIT_DEF instructions can be deleted when converting from
|
||||
/// GPR to mask.
|
||||
class InstrDeleter : public InstrConverterBase {
|
||||
public:
|
||||
InstrDeleter(unsigned SrcOpcode) : InstrConverterBase(SrcOpcode) {}
|
||||
|
||||
bool convertInstr(MachineInstr *MI, const TargetInstrInfo *TII,
|
||||
MachineRegisterInfo *MRI) const override {
|
||||
assert(isLegal(MI, TII) && "Cannot convert instruction");
|
||||
return true;
|
||||
}
|
||||
|
||||
double getExtraCost(const MachineInstr *MI,
|
||||
MachineRegisterInfo *MRI) const override {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
|
||||
// Key type to be used by the Instruction Converters map.
|
||||
// A converter is identified by <destination domain, source opcode>
|
||||
typedef std::pair<int, unsigned> InstrConverterBaseKeyTy;
|
||||
@@ -310,8 +292,12 @@ private:
|
||||
/// Domains which this closure can legally be reassigned to.
|
||||
std::bitset<NumDomains> LegalDstDomains;
|
||||
|
||||
/// An ID to uniquely identify this closure, even when it gets
|
||||
/// moved around
|
||||
unsigned ID;
|
||||
|
||||
public:
|
||||
Closure(std::initializer_list<RegDomain> LegalDstDomainList) {
|
||||
Closure(unsigned ID, std::initializer_list<RegDomain> LegalDstDomainList) : ID(ID) {
|
||||
for (RegDomain D : LegalDstDomainList)
|
||||
LegalDstDomains.set(D);
|
||||
}
|
||||
@@ -347,6 +333,27 @@ public:
|
||||
return Instrs;
|
||||
}
|
||||
|
||||
LLVM_DUMP_METHOD void dump(const MachineRegisterInfo *MRI) const {
|
||||
dbgs() << "Registers: ";
|
||||
bool First = true;
|
||||
for (unsigned Reg : Edges) {
|
||||
if (!First)
|
||||
dbgs() << ", ";
|
||||
First = false;
|
||||
dbgs() << printReg(Reg, MRI->getTargetRegisterInfo());
|
||||
}
|
||||
dbgs() << "\n" << "Instructions:";
|
||||
for (MachineInstr *MI : Instrs) {
|
||||
dbgs() << "\n ";
|
||||
MI->print(dbgs());
|
||||
}
|
||||
dbgs() << "\n";
|
||||
}
|
||||
|
||||
unsigned getID() const {
|
||||
return ID;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class X86DomainReassignment : public MachineFunctionPass {
|
||||
@@ -358,7 +365,7 @@ class X86DomainReassignment : public MachineFunctionPass {
|
||||
DenseSet<unsigned> EnclosedEdges;
|
||||
|
||||
/// All instructions that are included in some closure.
|
||||
DenseMap<MachineInstr *, Closure *> EnclosedInstrs;
|
||||
DenseMap<MachineInstr *, unsigned> EnclosedInstrs;
|
||||
|
||||
public:
|
||||
static char ID;
|
||||
@@ -435,14 +442,14 @@ void X86DomainReassignment::visitRegister(Closure &C, unsigned Reg,
|
||||
void X86DomainReassignment::encloseInstr(Closure &C, MachineInstr *MI) {
|
||||
auto I = EnclosedInstrs.find(MI);
|
||||
if (I != EnclosedInstrs.end()) {
|
||||
if (I->second != &C)
|
||||
if (I->second != C.getID())
|
||||
// Instruction already belongs to another closure, avoid conflicts between
|
||||
// closure and mark this closure as illegal.
|
||||
C.setAllIllegal();
|
||||
return;
|
||||
}
|
||||
|
||||
EnclosedInstrs[MI] = &C;
|
||||
EnclosedInstrs[MI] = C.getID();
|
||||
C.addInstruction(MI);
|
||||
|
||||
// Mark closure as illegal for reassignment to domains, if there is no
|
||||
@@ -587,7 +594,7 @@ void X86DomainReassignment::initConverters() {
|
||||
new InstrIgnore(TargetOpcode::PHI);
|
||||
|
||||
Converters[{MaskDomain, TargetOpcode::IMPLICIT_DEF}] =
|
||||
new InstrDeleter(TargetOpcode::IMPLICIT_DEF);
|
||||
new InstrIgnore(TargetOpcode::IMPLICIT_DEF);
|
||||
|
||||
Converters[{MaskDomain, TargetOpcode::INSERT_SUBREG}] =
|
||||
new InstrReplaceWithCopy(TargetOpcode::INSERT_SUBREG, 2);
|
||||
@@ -723,6 +730,7 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
std::vector<Closure> Closures;
|
||||
|
||||
// Go over all virtual registers and calculate a closure.
|
||||
unsigned ClosureID = 0;
|
||||
for (unsigned Idx = 0; Idx < MRI->getNumVirtRegs(); ++Idx) {
|
||||
unsigned Reg = TargetRegisterInfo::index2VirtReg(Idx);
|
||||
|
||||
@@ -735,7 +743,7 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
continue;
|
||||
|
||||
// Calculate closure starting with Reg.
|
||||
Closure C({MaskDomain});
|
||||
Closure C(ClosureID++, {MaskDomain});
|
||||
buildClosure(C, Reg);
|
||||
|
||||
// Collect all closures that can potentially be converted.
|
||||
@@ -743,15 +751,16 @@ bool X86DomainReassignment::runOnMachineFunction(MachineFunction &MF) {
|
||||
Closures.push_back(std::move(C));
|
||||
}
|
||||
|
||||
for (Closure &C : Closures)
|
||||
for (Closure &C : Closures) {
|
||||
DEBUG(C.dump(MRI));
|
||||
if (isReassignmentProfitable(C, MaskDomain)) {
|
||||
reassign(C, MaskDomain);
|
||||
++NumClosuresConverted;
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (auto I : Converters)
|
||||
delete I.second;
|
||||
DeleteContainerSeconds(Converters);
|
||||
|
||||
DEBUG(dbgs() << "***** Machine Function after Domain Reassignment *****\n");
|
||||
DEBUG(MF.print(dbgs()));
|
||||
|
@@ -1 +1 @@
|
||||
d482edc4b3d857336a8e0ff82a0d2a1b9039ed9d
|
||||
42fac99997d5480ca2c9886d1fb3a557f0f54abe
|
935
external/llvm/lib/Target/X86/X86FlagsCopyLowering.cpp
vendored
Normal file
935
external/llvm/lib/Target/X86/X86FlagsCopyLowering.cpp
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1 +1 @@
|
||||
261c9ce22a183900c16001661122c89f5f9df44c
|
||||
aa97a905ded038ea12e52b9e5ae1161a84cc37db
|
@@ -1 +1 @@
|
||||
2bd332f545da11681e63ee22d9eef248b8fb7b64
|
||||
3a23916ad4b5b53e4f14128e415bed14167d9f11
|
@@ -1099,9 +1099,6 @@ namespace llvm {
|
||||
bool lowerInterleavedStore(StoreInst *SI, ShuffleVectorInst *SVI,
|
||||
unsigned Factor) const override;
|
||||
|
||||
|
||||
void finalizeLowering(MachineFunction &MF) const override;
|
||||
|
||||
protected:
|
||||
std::pair<const TargetRegisterClass *, uint8_t>
|
||||
findRepresentativeClass(const TargetRegisterInfo *TRI,
|
||||
|
@@ -1334,7 +1334,7 @@ let Predicates = [HasBMI2] in {
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ADCX Instruction
|
||||
// ADCX and ADOX Instructions
|
||||
//
|
||||
let Predicates = [HasADX], Defs = [EFLAGS], Uses = [EFLAGS],
|
||||
Constraints = "$src0 = $dst", AddedComplexity = 10 in {
|
||||
@@ -1349,6 +1349,15 @@ let Predicates = [HasADX], Defs = [EFLAGS], Uses = [EFLAGS],
|
||||
[(set GR64:$dst, EFLAGS,
|
||||
(X86adc_flag GR64:$src0, GR64:$src, EFLAGS))],
|
||||
IIC_BIN_CARRY_NONMEM>, T8PD;
|
||||
|
||||
// We don't have patterns for ADOX yet.
|
||||
let hasSideEffects = 0 in {
|
||||
def ADOX32rr : I<0xF6, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src0, GR32:$src),
|
||||
"adox{l}\t{$src, $dst|$dst, $src}", [], IIC_BIN_NONMEM>, T8XS;
|
||||
|
||||
def ADOX64rr : RI<0xF6, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src0, GR64:$src),
|
||||
"adox{q}\t{$src, $dst|$dst, $src}", [], IIC_BIN_NONMEM>, T8XS;
|
||||
} // hasSideEffects = 0
|
||||
} // SchedRW
|
||||
|
||||
let mayLoad = 1, SchedRW = [WriteALULd] in {
|
||||
@@ -1363,27 +1372,14 @@ let Predicates = [HasADX], Defs = [EFLAGS], Uses = [EFLAGS],
|
||||
[(set GR64:$dst, EFLAGS,
|
||||
(X86adc_flag GR64:$src0, (loadi64 addr:$src), EFLAGS))],
|
||||
IIC_BIN_CARRY_MEM>, T8PD;
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// ADOX Instruction
|
||||
//
|
||||
let Predicates = [HasADX], hasSideEffects = 0, Defs = [EFLAGS],
|
||||
Uses = [EFLAGS] in {
|
||||
let SchedRW = [WriteALU] in {
|
||||
def ADOX32rr : I<0xF6, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),
|
||||
"adox{l}\t{$src, $dst|$dst, $src}", [], IIC_BIN_NONMEM>, T8XS;
|
||||
|
||||
def ADOX64rr : RI<0xF6, MRMSrcReg, (outs GR64:$dst), (ins GR64:$src),
|
||||
"adox{q}\t{$src, $dst|$dst, $src}", [], IIC_BIN_NONMEM>, T8XS;
|
||||
} // SchedRW
|
||||
|
||||
let mayLoad = 1, SchedRW = [WriteALULd] in {
|
||||
def ADOX32rm : I<0xF6, MRMSrcMem, (outs GR32:$dst), (ins i32mem:$src),
|
||||
// We don't have patterns for ADOX yet.
|
||||
let hasSideEffects = 0 in {
|
||||
def ADOX32rm : I<0xF6, MRMSrcMem, (outs GR32:$dst), (ins GR32:$src0, i32mem:$src),
|
||||
"adox{l}\t{$src, $dst|$dst, $src}", [], IIC_BIN_MEM>, T8XS;
|
||||
|
||||
def ADOX64rm : RI<0xF6, MRMSrcMem, (outs GR64:$dst), (ins i64mem:$src),
|
||||
def ADOX64rm : RI<0xF6, MRMSrcMem, (outs GR64:$dst), (ins GR64:$src0, i64mem:$src),
|
||||
"adox{q}\t{$src, $dst|$dst, $src}", [], IIC_BIN_MEM>, T8XS;
|
||||
}
|
||||
} // hasSideEffects = 0
|
||||
}
|
||||
|
@@ -473,7 +473,7 @@ let Defs = [EAX, ECX, EDX, FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7,
|
||||
ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7,
|
||||
MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
|
||||
XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
|
||||
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
|
||||
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS, DF],
|
||||
usesCustomInserter = 1, Uses = [ESP, SSP] in {
|
||||
def TLS_addr32 : I<0, Pseudo, (outs), (ins i32mem:$sym),
|
||||
"# TLS_addr32",
|
||||
@@ -493,7 +493,7 @@ let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11,
|
||||
ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7,
|
||||
MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
|
||||
XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
|
||||
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
|
||||
XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS, DF],
|
||||
usesCustomInserter = 1, Uses = [RSP, SSP] in {
|
||||
def TLS_addr64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
|
||||
"# TLS_addr64",
|
||||
@@ -509,7 +509,7 @@ def TLS_base_addr64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
|
||||
// For i386, the address of the thunk is passed on the stack, on return the
|
||||
// address of the variable is in %eax. %ecx is trashed during the function
|
||||
// call. All other registers are preserved.
|
||||
let Defs = [EAX, ECX, EFLAGS],
|
||||
let Defs = [EAX, ECX, EFLAGS, DF],
|
||||
Uses = [ESP, SSP],
|
||||
usesCustomInserter = 1 in
|
||||
def TLSCall_32 : I<0, Pseudo, (outs), (ins i32mem:$sym),
|
||||
@@ -522,7 +522,7 @@ def TLSCall_32 : I<0, Pseudo, (outs), (ins i32mem:$sym),
|
||||
// %rdi. The lowering will do the right thing with RDI.
|
||||
// On return the address of the variable is in %rax. All other
|
||||
// registers are preserved.
|
||||
let Defs = [RAX, EFLAGS],
|
||||
let Defs = [RAX, EFLAGS, DF],
|
||||
Uses = [RSP, SSP],
|
||||
usesCustomInserter = 1 in
|
||||
def TLSCall_64 : I<0, Pseudo, (outs), (ins i64mem:$sym),
|
||||
|
@@ -1 +1 @@
|
||||
7ca1c58184f63fd2101868310f1c26d6b58a73b0
|
||||
11ada51a87046aa82b69a5d566a6dc47e0f5fe10
|
6
external/llvm/lib/Target/X86/X86InstrInfo.h
vendored
6
external/llvm/lib/Target/X86/X86InstrInfo.h
vendored
@@ -77,6 +77,12 @@ unsigned getSETFromCond(CondCode CC, bool HasMemoryOperand = false);
|
||||
unsigned getCMovFromCond(CondCode CC, unsigned RegBytes,
|
||||
bool HasMemoryOperand = false);
|
||||
|
||||
// Turn jCC opcode into condition code.
|
||||
CondCode getCondFromBranchOpc(unsigned Opc);
|
||||
|
||||
// Turn setCC opcode into condition code.
|
||||
CondCode getCondFromSETOpc(unsigned Opc);
|
||||
|
||||
// Turn CMov opcode into condition code.
|
||||
CondCode getCondFromCMovOpc(unsigned Opc);
|
||||
|
||||
|
@@ -1 +1 @@
|
||||
a657b19c08c97c74cf5b5a740500bb5a5601746c
|
||||
68f40c28d52791651f66d178cb08dfe2f269459e
|
13
external/llvm/lib/Target/X86/X86InstrSystem.td
vendored
13
external/llvm/lib/Target/X86/X86InstrSystem.td
vendored
@@ -692,6 +692,19 @@ let Uses = [RAX, RBX, RCX, RDX], Defs = [RAX, RBX, RCX] in {
|
||||
} // Uses, Defs
|
||||
} // SchedRW
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// TS flag control instruction.
|
||||
let SchedRW = [WriteSystem] in {
|
||||
def CLTS : I<0x06, RawFrm, (outs), (ins), "clts", [], IIC_CLTS>, TB;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// IF (inside EFLAGS) management instructions.
|
||||
let SchedRW = [WriteSystem], Uses = [EFLAGS], Defs = [EFLAGS] in {
|
||||
def CLI : I<0xFA, RawFrm, (outs), (ins), "cli", [], IIC_CLI>;
|
||||
def STI : I<0xFB, RawFrm, (outs), (ins), "sti", [], IIC_STI>;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// RDPID Instruction
|
||||
let SchedRW = [WriteSystem] in {
|
||||
|
16
external/llvm/lib/Target/X86/X86RegisterInfo.td
vendored
16
external/llvm/lib/Target/X86/X86RegisterInfo.td
vendored
@@ -251,9 +251,19 @@ def ST7 : X86Reg<"st(7)", 7>, DwarfRegNum<[40, 19, 18]>;
|
||||
// Floating-point status word
|
||||
def FPSW : X86Reg<"fpsw", 0>;
|
||||
|
||||
// Status flags register
|
||||
// Status flags register.
|
||||
//
|
||||
// Note that some flags that are commonly thought of as part of the status
|
||||
// flags register are modeled separately. Typically this is due to instructions
|
||||
// reading and updating those flags independently of all the others. We don't
|
||||
// want to create false dependencies between these instructions and so we use
|
||||
// a separate register to model them.
|
||||
def EFLAGS : X86Reg<"flags", 0>;
|
||||
|
||||
// The direction flag.
|
||||
def DF : X86Reg<"DF", 0>;
|
||||
|
||||
|
||||
// Segment registers
|
||||
def CS : X86Reg<"cs", 1>;
|
||||
def DS : X86Reg<"ds", 3>;
|
||||
@@ -497,6 +507,10 @@ def FPCCR : RegisterClass<"X86", [i16], 16, (add FPSW)> {
|
||||
let CopyCost = -1; // Don't allow copying of status registers.
|
||||
let isAllocatable = 0;
|
||||
}
|
||||
def DFCCR : RegisterClass<"X86", [i32], 32, (add DF)> {
|
||||
let CopyCost = -1; // Don't allow copying of status registers.
|
||||
let isAllocatable = 0;
|
||||
}
|
||||
|
||||
// AVX-512 vector/mask registers.
|
||||
def VR512 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64],
|
||||
|
4
external/llvm/lib/Target/X86/X86Schedule.td
vendored
4
external/llvm/lib/Target/X86/X86Schedule.td
vendored
@@ -608,12 +608,10 @@ def IIC_CMPXCHG_8B : InstrItinClass;
|
||||
def IIC_CMPXCHG_16B : InstrItinClass;
|
||||
def IIC_LODS : InstrItinClass;
|
||||
def IIC_OUTS : InstrItinClass;
|
||||
def IIC_CLC : InstrItinClass;
|
||||
def IIC_CLC_CMC_STC : InstrItinClass;
|
||||
def IIC_CLD : InstrItinClass;
|
||||
def IIC_CLI : InstrItinClass;
|
||||
def IIC_CMC : InstrItinClass;
|
||||
def IIC_CLTS : InstrItinClass;
|
||||
def IIC_STC : InstrItinClass;
|
||||
def IIC_STI : InstrItinClass;
|
||||
def IIC_STD : InstrItinClass;
|
||||
def IIC_XLAT : InstrItinClass;
|
||||
|
@@ -514,12 +514,10 @@ def AtomItineraries : ProcessorItineraries<
|
||||
InstrItinData<IIC_CMPXCHG_16B, [InstrStage<22, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_LODS, [InstrStage<2, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_OUTS, [InstrStage<74, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CLC, [InstrStage<1, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CLC_CMC_STC, [InstrStage<1, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CLD, [InstrStage<3, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CLI, [InstrStage<14, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CMC, [InstrStage<1, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_CLTS, [InstrStage<33, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_STC, [InstrStage<1, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_STI, [InstrStage<17, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_STD, [InstrStage<21, [Port0, Port1]>] >,
|
||||
InstrItinData<IIC_XLAT, [InstrStage<6, [Port0, Port1]>] >,
|
||||
|
@@ -62,6 +62,7 @@ void initializeX86CallFrameOptimizationPass(PassRegistry &);
|
||||
void initializeX86CmovConverterPassPass(PassRegistry &);
|
||||
void initializeX86ExecutionDepsFixPass(PassRegistry &);
|
||||
void initializeX86DomainReassignmentPass(PassRegistry &);
|
||||
void initializeX86FlagsCopyLoweringPassPass(PassRegistry &);
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
@@ -80,6 +81,7 @@ extern "C" void LLVMInitializeX86Target() {
|
||||
initializeX86CmovConverterPassPass(PR);
|
||||
initializeX86ExecutionDepsFixPass(PR);
|
||||
initializeX86DomainReassignmentPass(PR);
|
||||
initializeX86FlagsCopyLoweringPassPass(PR);
|
||||
}
|
||||
|
||||
static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
|
||||
@@ -415,6 +417,7 @@ void X86PassConfig::addPreRegAlloc() {
|
||||
addPass(createX86CallFrameOptimization());
|
||||
}
|
||||
|
||||
addPass(createX86FlagsCopyLoweringPass());
|
||||
addPass(createX86WinAllocaExpander());
|
||||
}
|
||||
void X86PassConfig::addMachineSSAOptimization() {
|
||||
|
Reference in New Issue
Block a user