diff options
Diffstat (limited to 'contrib/llvm/lib/Target/X86/X86TargetMachine.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/X86/X86TargetMachine.cpp | 129 |
1 files changed, 72 insertions, 57 deletions
diff --git a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp index aa5cfc6..08c2cda 100644 --- a/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/contrib/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -11,22 +11,43 @@ // //===----------------------------------------------------------------------===// -#include "X86TargetMachine.h" +#include "MCTargetDesc/X86MCTargetDesc.h" #include "X86.h" #include "X86CallLowering.h" +#include "X86LegalizerInfo.h" +#include "X86MacroFusion.h" +#include "X86Subtarget.h" +#include "X86TargetMachine.h" #include "X86TargetObjectFile.h" #include "X86TargetTransformInfo.h" -#include "llvm/CodeGen/GlobalISel/GISelAccessor.h" +#include "llvm/ADT/Optional.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallString.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/Triple.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/CodeGen/ExecutionDepsFix.h" +#include "llvm/CodeGen/GlobalISel/CallLowering.h" #include "llvm/CodeGen/GlobalISel/IRTranslator.h" +#include "llvm/CodeGen/GlobalISel/InstructionSelect.h" +#include "llvm/CodeGen/GlobalISel/Legalizer.h" +#include "llvm/CodeGen/GlobalISel/RegBankSelect.h" #include "llvm/CodeGen/MachineScheduler.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetPassConfig.h" +#include "llvm/IR/Attributes.h" +#include "llvm/IR/DataLayout.h" #include "llvm/IR/Function.h" -#include "llvm/IR/LegacyPassManager.h" +#include "llvm/Pass.h" +#include "llvm/Support/CodeGen.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/FormattedStream.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/TargetRegistry.h" +#include "llvm/Target/TargetLoweringObjectFile.h" #include "llvm/Target/TargetOptions.h" +#include <memory> +#include <string> + using namespace llvm; static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner", @@ -34,8 +55,12 @@ static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner", cl::init(true), cl::Hidden); namespace llvm { + void initializeWinEHStatePassPass(PassRegistry &); -} +void initializeFixupLEAPassPass(PassRegistry &); +void initializeX86ExecutionDepsFixPass(PassRegistry &); + +} // end namespace llvm extern "C" void LLVMInitializeX86Target() { // Register the target. @@ -47,27 +72,31 @@ extern "C" void LLVMInitializeX86Target() { initializeWinEHStatePassPass(PR); initializeFixupBWInstPassPass(PR); initializeEvexToVexInstPassPass(PR); + initializeFixupLEAPassPass(PR); + initializeX86ExecutionDepsFixPass(PR); } static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) { if (TT.isOSBinFormatMachO()) { if (TT.getArch() == Triple::x86_64) - return make_unique<X86_64MachoTargetObjectFile>(); - return make_unique<TargetLoweringObjectFileMachO>(); + return llvm::make_unique<X86_64MachoTargetObjectFile>(); + return llvm::make_unique<TargetLoweringObjectFileMachO>(); } if (TT.isOSFreeBSD()) - return make_unique<X86FreeBSDTargetObjectFile>(); - if (TT.isOSLinux() || TT.isOSNaCl()) - return make_unique<X86LinuxNaClTargetObjectFile>(); + return llvm::make_unique<X86FreeBSDTargetObjectFile>(); + if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU()) + return llvm::make_unique<X86LinuxNaClTargetObjectFile>(); + if (TT.isOSSolaris()) + return llvm::make_unique<X86SolarisTargetObjectFile>(); if (TT.isOSFuchsia()) - return make_unique<X86FuchsiaTargetObjectFile>(); + return llvm::make_unique<X86FuchsiaTargetObjectFile>(); if (TT.isOSBinFormatELF()) - return make_unique<X86ELFTargetObjectFile>(); + return llvm::make_unique<X86ELFTargetObjectFile>(); if (TT.isKnownWindowsMSVCEnvironment() || TT.isWindowsCoreCLREnvironment()) - return make_unique<X86WindowsTargetObjectFile>(); + return llvm::make_unique<X86WindowsTargetObjectFile>(); if (TT.isOSBinFormatCOFF()) - return make_unique<TargetLoweringObjectFileCOFF>(); + return llvm::make_unique<TargetLoweringObjectFileCOFF>(); llvm_unreachable("unknown subtarget type"); } @@ -177,31 +206,8 @@ X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT, initAsmInfo(); } -X86TargetMachine::~X86TargetMachine() {} +X86TargetMachine::~X86TargetMachine() = default; -#ifdef LLVM_BUILD_GLOBAL_ISEL -namespace { -struct X86GISelActualAccessor : public GISelAccessor { - std::unique_ptr<CallLowering> CL; - X86GISelActualAccessor(CallLowering* CL): CL(CL) {} - const CallLowering *getCallLowering() const override { - return CL.get(); - } - const InstructionSelector *getInstructionSelector() const override { - //TODO: Implement - return nullptr; - } - const LegalizerInfo *getLegalizerInfo() const override { - //TODO: Implement - return nullptr; - } - const RegisterBankInfo *getRegBankInfo() const override { - //TODO: Implement - return nullptr; - } -}; -} // End anonymous namespace. -#endif const X86Subtarget * X86TargetMachine::getSubtargetImpl(const Function &F) const { Attribute CPUAttr = F.getFnAttribute("target-cpu"); @@ -241,13 +247,6 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const { resetTargetOptions(F); I = llvm::make_unique<X86Subtarget>(TargetTriple, CPU, FS, *this, Options.StackAlignmentOverride); -#ifndef LLVM_BUILD_GLOBAL_ISEL - GISelAccessor *GISel = new GISelAccessor(); -#else - X86GISelActualAccessor *GISel = new X86GISelActualAccessor( - new X86CallLowering(*I->getTargetLowering())); -#endif - I->setGISelAccessor(*GISel); } return I.get(); } @@ -270,16 +269,16 @@ TargetIRAnalysis X86TargetMachine::getTargetIRAnalysis() { }); } - //===----------------------------------------------------------------------===// // Pass Pipeline Configuration //===----------------------------------------------------------------------===// namespace { + /// X86 Code Generator Pass Configuration Options. class X86PassConfig : public TargetPassConfig { public: - X86PassConfig(X86TargetMachine *TM, PassManagerBase &PM) + X86PassConfig(X86TargetMachine &TM, PassManagerBase &PM) : TargetPassConfig(TM, PM) {} X86TargetMachine &getX86TargetMachine() const { @@ -289,7 +288,7 @@ public: ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override { ScheduleDAGMILive *DAG = createGenericSchedLive(C); - DAG->addMutation(createMacroFusionDAGMutation(DAG->TII)); + DAG->addMutation(createX86MacroFusionDAGMutation()); return DAG; } @@ -301,26 +300,40 @@ public: bool addRegBankSelect() override; bool addGlobalInstructionSelect() override; #endif -bool addILPOpts() override; + bool addILPOpts() override; bool addPreISel() override; void addPreRegAlloc() override; void addPostRegAlloc() override; void addPreEmitPass() override; void addPreSched2() override; }; -} // namespace + +class X86ExecutionDepsFix : public ExecutionDepsFix { +public: + static char ID; + X86ExecutionDepsFix() : ExecutionDepsFix(ID, X86::VR128XRegClass) {} + StringRef getPassName() const override { + return "X86 Execution Dependency Fix"; + } +}; +char X86ExecutionDepsFix::ID; + +} // end anonymous namespace + +INITIALIZE_PASS(X86ExecutionDepsFix, "x86-execution-deps-fix", + "X86 Execution Dependency Fix", false, false) TargetPassConfig *X86TargetMachine::createPassConfig(PassManagerBase &PM) { - return new X86PassConfig(this, PM); + return new X86PassConfig(*this, PM); } void X86PassConfig::addIRPasses() { - addPass(createAtomicExpandPass(&getX86TargetMachine())); + addPass(createAtomicExpandPass()); TargetPassConfig::addIRPasses(); if (TM->getOptLevel() != CodeGenOpt::None) - addPass(createInterleavedAccessPass(TM)); + addPass(createInterleavedAccessPass()); } bool X86PassConfig::addInstSelector() { @@ -343,17 +356,17 @@ bool X86PassConfig::addIRTranslator() { } bool X86PassConfig::addLegalizeMachineIR() { - //TODO: Implement + addPass(new Legalizer()); return false; } bool X86PassConfig::addRegBankSelect() { - //TODO: Implement + addPass(new RegBankSelect()); return false; } bool X86PassConfig::addGlobalInstructionSelect() { - //TODO: Implement + addPass(new InstructionSelect()); return false; } #endif @@ -362,6 +375,7 @@ bool X86PassConfig::addILPOpts() { addPass(&EarlyIfConverterID); if (EnableMachineCombinerPass) addPass(&MachineCombinerID); + addPass(createX86CmovConverterPass()); return true; } @@ -375,6 +389,7 @@ bool X86PassConfig::addPreISel() { void X86PassConfig::addPreRegAlloc() { if (getOptLevel() != CodeGenOpt::None) { + addPass(&LiveRangeShrinkID); addPass(createX86FixupSetCC()); addPass(createX86OptimizeLEAs()); addPass(createX86CallFrameOptimization()); @@ -391,7 +406,7 @@ void X86PassConfig::addPreSched2() { addPass(createX86ExpandPseudoPass()); } void X86PassConfig::addPreEmitPass() { if (getOptLevel() != CodeGenOpt::None) - addPass(createExecutionDependencyFixPass(&X86::VR128XRegClass)); + addPass(new X86ExecutionDepsFix()); if (UseVZeroUpper) addPass(createX86IssueVZeroUpperPass()); |