diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2018-04-20 16:09:38 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2018-04-20 16:09:38 +0000 |
commit | 1eac879642f94d4401fe0586361fdda8b861e37e (patch) | |
tree | 30e6b186c2abc3962cf5d6289e8f1159f3b8f17f /gnu/llvm | |
parent | 1fcdae3803f12bcab8d7dcd79f499606f6286306 (diff) |
oops, snapshot tests not ready yet
Diffstat (limited to 'gnu/llvm')
-rw-r--r-- | gnu/llvm/lib/Target/X86/CMakeLists.txt | 28 | ||||
-rw-r--r-- | gnu/llvm/lib/Target/X86/X86.h | 44 | ||||
-rw-r--r-- | gnu/llvm/lib/Target/X86/X86TargetMachine.cpp | 277 |
3 files changed, 56 insertions, 293 deletions
diff --git a/gnu/llvm/lib/Target/X86/CMakeLists.txt b/gnu/llvm/lib/Target/X86/CMakeLists.txt index 2c52e128ddd..55949155da9 100644 --- a/gnu/llvm/lib/Target/X86/CMakeLists.txt +++ b/gnu/llvm/lib/Target/X86/CMakeLists.txt @@ -10,46 +10,22 @@ tablegen(LLVM X86GenDAGISel.inc -gen-dag-isel) tablegen(LLVM X86GenFastISel.inc -gen-fast-isel) tablegen(LLVM X86GenCallingConv.inc -gen-callingconv) tablegen(LLVM X86GenSubtargetInfo.inc -gen-subtarget) -tablegen(LLVM X86GenEVEX2VEXTables.inc -gen-x86-EVEX2VEX-tables) -tablegen(LLVM X86GenRegisterBank.inc -gen-register-bank) -tablegen(LLVM X86GenGlobalISel.inc -gen-global-isel) - -if (X86_GEN_FOLD_TABLES) - tablegen(LLVM X86GenFoldTables.inc -gen-x86-fold-tables) -endif() - add_public_tablegen_target(X86CommonTableGen) set(sources X86AsmPrinter.cpp X86CallFrameOptimization.cpp - X86CallLowering.cpp - X86CmovConversion.cpp - X86DomainReassignment.cpp X86ExpandPseudo.cpp X86FastISel.cpp - X86FixupBWInsts.cpp - X86FixupGadgets.cpp - X86FixupLEAs.cpp - X86FixupSetCC.cpp X86FloatingPoint.cpp X86FrameLowering.cpp - X86InstructionSelector.cpp X86ISelDAGToDAG.cpp X86ISelLowering.cpp - X86InterleavedAccess.cpp - X86InstrFMA3Info.cpp X86InstrInfo.cpp - X86EvexToVex.cpp - X86LegalizerInfo.cpp X86MCInstLower.cpp X86MachineFunctionInfo.cpp - X86MacroFusion.cpp - X86OptimizeLEAs.cpp X86PadShortFunction.cpp - X86RegisterBankInfo.cpp X86RegisterInfo.cpp - X86RetpolineThunks.cpp X86SelectionDAGInfo.cpp X86ShuffleDecodeConstantPool.cpp X86Subtarget.cpp @@ -57,9 +33,9 @@ set(sources X86TargetObjectFile.cpp X86TargetTransformInfo.cpp X86VZeroUpper.cpp - X86WinAllocaExpander.cpp + X86FixupLEAs.cpp X86WinEHState.cpp - X86CallingConv.cpp + X86OptimizeLEAs.cpp ) add_llvm_target(X86CodeGen ${sources}) diff --git a/gnu/llvm/lib/Target/X86/X86.h b/gnu/llvm/lib/Target/X86/X86.h index db7930a265a..01e65b89f48 100644 --- a/gnu/llvm/lib/Target/X86/X86.h +++ b/gnu/llvm/lib/Target/X86/X86.h @@ -21,11 +21,6 @@ namespace llvm { class FunctionPass; class ImmutablePass; -class InstructionSelector; -class ModulePass; -class PassRegistry; -class X86RegisterBankInfo; -class X86Subtarget; class X86TargetMachine; /// This pass converts a legalized DAG into a X86-specific DAG, ready for @@ -63,12 +58,6 @@ FunctionPass *createX86FixupLEAs(); /// recalculations. FunctionPass *createX86OptimizeLEAs(); -/// Return a pass that transforms setcc + movzx pairs into xor + setcc. -FunctionPass *createX86FixupSetCC(); - -/// Return a pass that expands WinAlloca pseudo-instructions. -FunctionPass *createX86WinAllocaExpander(); - /// Return a pass that optimizes the code-size of x86 call sequences. This is /// done by replacing esp-relative movs with pushes. FunctionPass *createX86CallFrameOptimization(); @@ -83,39 +72,6 @@ FunctionPass *createX86WinEHStatePass(); /// must run after prologue/epilogue insertion and before lowering /// the MachineInstr to MC. FunctionPass *createX86ExpandPseudoPass(); - -/// This pass converts X86 cmov instructions into branch when profitable. -FunctionPass *createX86CmovConverterPass(); - -/// Return a Machine IR pass that selectively replaces -/// certain byte and word instructions by equivalent 32 bit instructions, -/// in order to eliminate partial register usage, false dependences on -/// the upper portions of registers, and to save code size. -FunctionPass *createX86FixupBWInsts(); - -/// Return a Machine IR pass that reassigns instruction chains from one domain -/// to another, when profitable. -FunctionPass *createX86DomainReassignmentPass(); - -void initializeFixupBWInstPassPass(PassRegistry &); - -/// Return a Machine Function pass that attempts to replace -/// ROP friendly instructions with alternatives. -FunctionPass *createX86FixupGadgetsPass(); - -/// This pass replaces EVEX encoded of AVX-512 instructiosn by VEX -/// encoding when possible in order to reduce code size. -FunctionPass *createX86EvexToVexInsts(); - -/// This pass creates the thunks for the retpoline feature. -FunctionPass *createX86RetpolineThunksPass(); - -InstructionSelector *createX86InstructionSelector(const X86TargetMachine &TM, - X86Subtarget &, - X86RegisterBankInfo &); - -void initializeEvexToVexInstPassPass(PassRegistry &); - } // End llvm namespace #endif diff --git a/gnu/llvm/lib/Target/X86/X86TargetMachine.cpp b/gnu/llvm/lib/Target/X86/X86TargetMachine.cpp index 1d40c347efa..0e7e4c0c84a 100644 --- a/gnu/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/gnu/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -12,42 +12,16 @@ //===----------------------------------------------------------------------===// #include "X86TargetMachine.h" -#include "MCTargetDesc/X86MCTargetDesc.h" #include "X86.h" -#include "X86CallLowering.h" -#include "X86LegalizerInfo.h" -#include "X86MacroFusion.h" -#include "X86Subtarget.h" #include "X86TargetObjectFile.h" #include "X86TargetTransformInfo.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/TargetLoweringObjectFile.h" -#include "llvm/CodeGen/TargetPassConfig.h" -#include "llvm/IR/Attributes.h" -#include "llvm/IR/DataLayout.h" #include "llvm/IR/Function.h" -#include "llvm/Pass.h" -#include "llvm/Support/CodeGen.h" +#include "llvm/IR/LegacyPassManager.h" #include "llvm/Support/CommandLine.h" -#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FormattedStream.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Target/TargetOptions.h" -#include <memory> -#include <string> - using namespace llvm; static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner", @@ -55,54 +29,33 @@ static cl::opt<bool> EnableMachineCombinerPass("x86-machine-combiner", cl::init(true), cl::Hidden); namespace llvm { - void initializeWinEHStatePassPass(PassRegistry &); -void initializeFixupLEAPassPass(PassRegistry &); -void initializeX86CallFrameOptimizationPass(PassRegistry &); -void initializeX86CmovConverterPassPass(PassRegistry &); -void initializeX86ExecutionDepsFixPass(PassRegistry &); -void initializeX86DomainReassignmentPass(PassRegistry &); - -} // end namespace llvm +} extern "C" void LLVMInitializeX86Target() { // Register the target. - RegisterTargetMachine<X86TargetMachine> X(getTheX86_32Target()); - RegisterTargetMachine<X86TargetMachine> Y(getTheX86_64Target()); + RegisterTargetMachine<X86TargetMachine> X(TheX86_32Target); + RegisterTargetMachine<X86TargetMachine> Y(TheX86_64Target); PassRegistry &PR = *PassRegistry::getPassRegistry(); - initializeGlobalISel(PR); initializeWinEHStatePassPass(PR); - initializeFixupBWInstPassPass(PR); - initializeEvexToVexInstPassPass(PR); - initializeFixupLEAPassPass(PR); - initializeX86CallFrameOptimizationPass(PR); - initializeX86CmovConverterPassPass(PR); - initializeX86ExecutionDepsFixPass(PR); - initializeX86DomainReassignmentPass(PR); } static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) { if (TT.isOSBinFormatMachO()) { if (TT.getArch() == Triple::x86_64) - return llvm::make_unique<X86_64MachoTargetObjectFile>(); - return llvm::make_unique<TargetLoweringObjectFileMachO>(); + return make_unique<X86_64MachoTargetObjectFile>(); + return make_unique<TargetLoweringObjectFileMachO>(); } - if (TT.isOSFreeBSD()) - 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 llvm::make_unique<X86FuchsiaTargetObjectFile>(); + if (TT.isOSLinux() || TT.isOSNaCl()) + return make_unique<X86LinuxNaClTargetObjectFile>(); if (TT.isOSBinFormatELF()) - return llvm::make_unique<X86ELFTargetObjectFile>(); + return make_unique<X86ELFTargetObjectFile>(); if (TT.isKnownWindowsMSVCEnvironment() || TT.isWindowsCoreCLREnvironment()) - return llvm::make_unique<X86WindowsTargetObjectFile>(); + return make_unique<X86WindowsTargetObjectFile>(); if (TT.isOSBinFormatCOFF()) - return llvm::make_unique<TargetLoweringObjectFileCOFF>(); + return make_unique<TargetLoweringObjectFileCOFF>(); llvm_unreachable("unknown subtarget type"); } @@ -120,22 +73,17 @@ static std::string computeDataLayout(const Triple &TT) { // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32. if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl()) Ret += "-i64:64"; - else if (TT.isOSIAMCU()) - Ret += "-i64:32-f64:32"; else Ret += "-f64:32:64"; // Some ABIs align long double to 128 bits, others to 32. - if (TT.isOSNaCl() || TT.isOSIAMCU()) + if (TT.isOSNaCl()) ; // No f80 else if (TT.isArch64Bit() || TT.isOSDarwin()) Ret += "-f80:128"; else Ret += "-f80:32"; - if (TT.isOSIAMCU()) - Ret += "-f128:32"; - // The registers can hold 8, 16, 32 or, in x86-64, 64 bits. if (TT.isArch64Bit()) Ret += "-n8:16:32:64"; @@ -143,7 +91,7 @@ static std::string computeDataLayout(const Triple &TT) { Ret += "-n8:16:32"; // The stack is aligned to 32 bits on some ABIs and 128 bits on others. - if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU()) + if (!TT.isArch64Bit() && TT.isOSWindows()) Ret += "-a:0:32-S32"; else Ret += "-S128"; @@ -151,97 +99,50 @@ static std::string computeDataLayout(const Triple &TT) { return Ret; } -static Reloc::Model getEffectiveRelocModel(const Triple &TT, - Optional<Reloc::Model> RM) { - bool is64Bit = TT.getArch() == Triple::x86_64; - if (!RM.hasValue()) { - // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode. - // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we - // use static relocation model by default. - if (TT.isOSDarwin()) { - if (is64Bit) - return Reloc::PIC_; - return Reloc::DynamicNoPIC; - } - if (TT.isOSWindows() && is64Bit) - return Reloc::PIC_; - return Reloc::Static; - } - - // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC - // is defined as a model for code which may be used in static or dynamic - // executables but not necessarily a shared library. On X86-32 we just - // compile in -static mode, in x86-64 we use PIC. - if (*RM == Reloc::DynamicNoPIC) { - if (is64Bit) - return Reloc::PIC_; - if (!TT.isOSDarwin()) - return Reloc::Static; - } - - // If we are on Darwin, disallow static relocation model in X86-64 mode, since - // the Mach-O file format doesn't support it. - if (*RM == Reloc::Static && TT.isOSDarwin() && is64Bit) - return Reloc::PIC_; - - return *RM; -} - -static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM, - bool JIT, bool Is64Bit) { - if (CM) - return *CM; - if (JIT) - return Is64Bit ? CodeModel::Large : CodeModel::Small; - return CodeModel::Small; -} - -/// Create an X86 target. +/// X86TargetMachine ctor - Create an X86 target. /// X86TargetMachine::X86TargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, - Optional<Reloc::Model> RM, - Optional<CodeModel::Model> CM, - CodeGenOpt::Level OL, bool JIT) - : LLVMTargetMachine( - T, computeDataLayout(TT), TT, CPU, FS, Options, - getEffectiveRelocModel(TT, RM), - getEffectiveCodeModel(CM, JIT, TT.getArch() == Triple::x86_64), OL), - TLOF(createTLOF(getTargetTriple())) { + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL) + : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options, RM, CM, + OL), + TLOF(createTLOF(getTargetTriple())), + Subtarget(TT, CPU, FS, *this, Options.StackAlignmentOverride) { // Windows stack unwinder gets confused when execution flow "falls through" // after a call to 'noreturn' function. // To prevent that, we emit a trap for 'unreachable' IR instructions. // (which on X86, happens to be the 'ud2' instruction) - // On PS4, the "return address" of a 'noreturn' call must still be within - // the calling function, and TrapUnreachable is an easy way to get that. - // The check here for 64-bit windows is a bit icky, but as we're unlikely - // to ever want to mix 32 and 64-bit windows code in a single module - // this should be fine. - if ((TT.isOSWindows() && TT.getArch() == Triple::x86_64) || TT.isPS4()) + if (Subtarget.isTargetWin64()) this->Options.TrapUnreachable = true; + // By default (and when -ffast-math is on), enable estimate codegen for + // everything except scalar division. By default, use 1 refinement step for + // all operations. Defaults may be overridden by using command-line options. + // Scalar division estimates are disabled because they break too much + // real-world code. These defaults match GCC behavior. + this->Options.Reciprocals.setDefaults("sqrtf", true, 1); + this->Options.Reciprocals.setDefaults("divf", false, 1); + this->Options.Reciprocals.setDefaults("vec-sqrtf", true, 1); + this->Options.Reciprocals.setDefaults("vec-divf", true, 1); + initAsmInfo(); } -X86TargetMachine::~X86TargetMachine() = default; +X86TargetMachine::~X86TargetMachine() {} const X86Subtarget * X86TargetMachine::getSubtargetImpl(const Function &F) const { Attribute CPUAttr = F.getFnAttribute("target-cpu"); Attribute FSAttr = F.getFnAttribute("target-features"); - StringRef CPU = !CPUAttr.hasAttribute(Attribute::None) - ? CPUAttr.getValueAsString() - : (StringRef)TargetCPU; - StringRef FS = !FSAttr.hasAttribute(Attribute::None) - ? FSAttr.getValueAsString() - : (StringRef)TargetFS; - - SmallString<512> Key; - Key.reserve(CPU.size() + FS.size()); - Key += CPU; - Key += FS; + std::string CPU = !CPUAttr.hasAttribute(Attribute::None) + ? CPUAttr.getValueAsString().str() + : TargetCPU; + std::string FS = !FSAttr.hasAttribute(Attribute::None) + ? FSAttr.getValueAsString().str() + : TargetFS; // FIXME: This is related to the code below to reset the target options, // we need to know whether or not the soft float flag is set on the @@ -249,15 +150,14 @@ X86TargetMachine::getSubtargetImpl(const Function &F) const { // it as a key for the subtarget since that can be the only difference // between two functions. bool SoftFloat = + F.hasFnAttribute("use-soft-float") && F.getFnAttribute("use-soft-float").getValueAsString() == "true"; // If the soft float attribute is set on the function turn on the soft float // subtarget feature. if (SoftFloat) - Key += FS.empty() ? "+soft-float" : ",+soft-float"; - - FS = Key.substr(CPU.size()); + FS += FS.empty() ? "+soft-float" : ",+soft-float"; - auto &I = SubtargetMap[Key]; + auto &I = SubtargetMap[CPU + FS]; if (!I) { // This needs to be done before we create a new subtarget since any // creation will depend on the TM and the code generation flags on the @@ -281,81 +181,47 @@ UseVZeroUpper("x86-use-vzeroupper", cl::Hidden, // X86 TTI query. //===----------------------------------------------------------------------===// -TargetTransformInfo -X86TargetMachine::getTargetTransformInfo(const Function &F) { - return TargetTransformInfo(X86TTIImpl(this, F)); +TargetIRAnalysis X86TargetMachine::getTargetIRAnalysis() { + return TargetIRAnalysis([this](const Function &F) { + return TargetTransformInfo(X86TTIImpl(this, F)); + }); } + //===----------------------------------------------------------------------===// // 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 { return getTM<X86TargetMachine>(); } - ScheduleDAGInstrs * - createMachineScheduler(MachineSchedContext *C) const override { - ScheduleDAGMILive *DAG = createGenericSchedLive(C); - DAG->addMutation(createX86MacroFusionDAGMutation()); - return DAG; - } - void addIRPasses() override; bool addInstSelector() override; - bool addIRTranslator() override; - bool addLegalizeMachineIR() override; - bool addRegBankSelect() override; - bool addGlobalInstructionSelect() override; bool addILPOpts() override; bool addPreISel() override; - void addMachineSSAOptimization() override; void addPreRegAlloc() override; void addPostRegAlloc() override; void addPreEmitPass() override; - void addPreEmitPass2() override; void addPreSched2() override; }; - -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) +} // namespace TargetPassConfig *X86TargetMachine::createPassConfig(PassManagerBase &PM) { - return new X86PassConfig(*this, PM); + return new X86PassConfig(this, PM); } void X86PassConfig::addIRPasses() { - addPass(createAtomicExpandPass()); + addPass(createAtomicExpandPass(&getX86TargetMachine())); TargetPassConfig::addIRPasses(); - - if (TM->getOptLevel() != CodeGenOpt::None) - addPass(createInterleavedAccessPass()); - - // Add passes that handle indirect branch removal and insertion of a retpoline - // thunk. These will be a no-op unless a function subtarget has the retpoline - // feature enabled. - addPass(createIndirectBrExpandPass()); } bool X86PassConfig::addInstSelector() { @@ -368,26 +234,7 @@ bool X86PassConfig::addInstSelector() { addPass(createCleanupLocalDynamicTLSPass()); addPass(createX86GlobalBaseRegPass()); - return false; -} - -bool X86PassConfig::addIRTranslator() { - addPass(new IRTranslator()); - return false; -} -bool X86PassConfig::addLegalizeMachineIR() { - addPass(new Legalizer()); - return false; -} - -bool X86PassConfig::addRegBankSelect() { - addPass(new RegBankSelect()); - return false; -} - -bool X86PassConfig::addGlobalInstructionSelect() { - addPass(new InstructionSelect()); return false; } @@ -395,7 +242,6 @@ bool X86PassConfig::addILPOpts() { addPass(&EarlyIfConverterID); if (EnableMachineCombinerPass) addPass(&MachineCombinerID); - addPass(createX86CmovConverterPass()); return true; } @@ -408,18 +254,10 @@ bool X86PassConfig::addPreISel() { } void X86PassConfig::addPreRegAlloc() { - if (getOptLevel() != CodeGenOpt::None) { - addPass(&LiveRangeShrinkID); - addPass(createX86FixupSetCC()); + if (getOptLevel() != CodeGenOpt::None) addPass(createX86OptimizeLEAs()); - addPass(createX86CallFrameOptimization()); - } - addPass(createX86WinAllocaExpander()); -} -void X86PassConfig::addMachineSSAOptimization() { - addPass(createX86DomainReassignmentPass()); - TargetPassConfig::addMachineSSAOptimization(); + addPass(createX86CallFrameOptimization()); } void X86PassConfig::addPostRegAlloc() { @@ -430,20 +268,13 @@ void X86PassConfig::addPreSched2() { addPass(createX86ExpandPseudoPass()); } void X86PassConfig::addPreEmitPass() { if (getOptLevel() != CodeGenOpt::None) - addPass(new X86ExecutionDepsFix()); + addPass(createExecutionDependencyFixPass(&X86::VR128RegClass)); if (UseVZeroUpper) addPass(createX86IssueVZeroUpperPass()); if (getOptLevel() != CodeGenOpt::None) { - addPass(createX86FixupBWInsts()); addPass(createX86PadShortFunctions()); addPass(createX86FixupLEAs()); - addPass(createX86EvexToVexInsts()); } - addPass(createX86FixupGadgetsPass()); -} - -void X86PassConfig::addPreEmitPass2() { - addPass(createX86RetpolineThunksPass()); } |