diff options
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCTargetMachine.cpp')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCTargetMachine.cpp | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp index 3858d44e5099..b09975172bf5 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetMachine.cpp @@ -100,6 +100,11 @@ static cl::opt<bool> cl::desc("Expand eligible cr-logical binary ops to branches"), cl::init(true), cl::Hidden); +static cl::opt<bool> MergeStringPool( + "ppc-merge-string-pool", + cl::desc("Merge all of the strings in a module into one pool"), + cl::init(true), cl::Hidden); + static cl::opt<bool> EnablePPCGenScalarMASSEntries( "enable-ppc-gen-scalar-mass", cl::init(false), cl::desc("Enable lowering math functions to their corresponding MASS " @@ -137,6 +142,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCTarget() { initializeGlobalISel(PR); initializePPCCTRLoopsPass(PR); initializePPCDAGToDAGISelPass(PR); + initializePPCMergeStringPoolPass(PR); } static bool isLittleEndianTriple(const Triple &T) { @@ -191,7 +197,7 @@ static std::string getDataLayoutString(const Triple &T) { return Ret; } -static std::string computeFSAdditions(StringRef FS, CodeGenOpt::Level OL, +static std::string computeFSAdditions(StringRef FS, CodeGenOptLevel OL, const Triple &TT) { std::string FullFS = std::string(FS); @@ -203,14 +209,14 @@ static std::string computeFSAdditions(StringRef FS, CodeGenOpt::Level OL, FullFS = "+64bit"; } - if (OL >= CodeGenOpt::Default) { + if (OL >= CodeGenOptLevel::Default) { if (!FullFS.empty()) FullFS = "+crbits," + FullFS; else FullFS = "+crbits"; } - if (OL != CodeGenOpt::None) { + if (OL != CodeGenOptLevel::None) { if (!FullFS.empty()) FullFS = "+invariant-function-descriptors," + FullFS; else @@ -259,8 +265,9 @@ static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT, static Reloc::Model getEffectiveRelocModel(const Triple &TT, std::optional<Reloc::Model> RM) { - assert((!TT.isOSAIX() || !RM || *RM == Reloc::PIC_) && - "Invalid relocation model for AIX."); + if (TT.isOSAIX() && RM && *RM != Reloc::PIC_) + report_fatal_error("invalid relocation model, AIX only supports PIC", + false); if (RM) return *RM; @@ -339,7 +346,7 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, const Triple &TT, const TargetOptions &Options, std::optional<Reloc::Model> RM, std::optional<CodeModel::Model> CM, - CodeGenOpt::Level OL, bool JIT) + CodeGenOptLevel OL, bool JIT) : LLVMTargetMachine(T, getDataLayoutString(TT), TT, CPU, computeFSAdditions(FS, OL, TT), Options, getEffectiveRelocModel(TT, RM), @@ -408,7 +415,7 @@ public: : TargetPassConfig(TM, PM) { // At any optimization level above -O0 we use the Machine Scheduler and not // the default Post RA List Scheduler. - if (TM.getOptLevel() != CodeGenOpt::None) + if (TM.getOptLevel() != CodeGenOptLevel::None) substitutePass(&PostRASchedulerID, &PostMachineSchedulerID); } @@ -448,7 +455,7 @@ TargetPassConfig *PPCTargetMachine::createPassConfig(PassManagerBase &PM) { } void PPCPassConfig::addIRPasses() { - if (TM->getOptLevel() != CodeGenOpt::None) + if (TM->getOptLevel() != CodeGenOptLevel::None) addPass(createPPCBoolRetToIntPass()); addPass(createAtomicExpandPass()); @@ -457,7 +464,7 @@ void PPCPassConfig::addIRPasses() { // Generate PowerPC target-specific entries for scalar math functions // that are available in IBM MASS (scalar) library. - if (TM->getOptLevel() == CodeGenOpt::Aggressive && + if (TM->getOptLevel() == CodeGenOptLevel::Aggressive && EnablePPCGenScalarMASSEntries) { TM->Options.PPCGenScalarMASSEntries = EnablePPCGenScalarMASSEntries; addPass(createPPCGenScalarMASSEntriesPass()); @@ -467,7 +474,7 @@ void PPCPassConfig::addIRPasses() { if (EnablePrefetch.getNumOccurrences() > 0) addPass(createLoopDataPrefetchPass()); - if (TM->getOptLevel() >= CodeGenOpt::Default && EnableGEPOpt) { + if (TM->getOptLevel() >= CodeGenOptLevel::Default && EnableGEPOpt) { // Call SeparateConstOffsetFromGEP pass to extract constants within indices // and lower a GEP with multiple indices to either arithmetic operations or // multiple GEPs with single index. @@ -484,10 +491,13 @@ void PPCPassConfig::addIRPasses() { } bool PPCPassConfig::addPreISel() { - if (!DisableInstrFormPrep && getOptLevel() != CodeGenOpt::None) + if (MergeStringPool && getOptLevel() != CodeGenOptLevel::None) + addPass(createPPCMergeStringPoolPass()); + + if (!DisableInstrFormPrep && getOptLevel() != CodeGenOptLevel::None) addPass(createPPCLoopInstrFormPrepPass(getPPCTargetMachine())); - if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) + if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None) addPass(createHardwareLoopsLegacyPass()); return false; @@ -507,7 +517,7 @@ bool PPCPassConfig::addInstSelector() { addPass(createPPCISelDag(getPPCTargetMachine(), getOptLevel())); #ifndef NDEBUG - if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) + if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None) addPass(createPPCCTRLoopsVerify()); #endif @@ -518,12 +528,12 @@ bool PPCPassConfig::addInstSelector() { void PPCPassConfig::addMachineSSAOptimization() { // Run CTR loops pass before any cfg modification pass to prevent the // canonical form of hardware loop from being destroied. - if (!DisableCTRLoops && getOptLevel() != CodeGenOpt::None) + if (!DisableCTRLoops && getOptLevel() != CodeGenOptLevel::None) addPass(createPPCCTRLoopsPass()); // PPCBranchCoalescingPass need to be done before machine sinking // since it merges empty blocks. - if (EnableBranchCoalescing && getOptLevel() != CodeGenOpt::None) + if (EnableBranchCoalescing && getOptLevel() != CodeGenOptLevel::None) addPass(createPPCBranchCoalescingPass()); TargetPassConfig::addMachineSSAOptimization(); // For little endian, remove where possible the vector swap instructions @@ -532,7 +542,7 @@ void PPCPassConfig::addMachineSSAOptimization() { !DisableVSXSwapRemoval) addPass(createPPCVSXSwapRemovalPass()); // Reduce the number of cr-logical ops. - if (ReduceCRLogical && getOptLevel() != CodeGenOpt::None) + if (ReduceCRLogical && getOptLevel() != CodeGenOptLevel::None) addPass(createPPCReduceCRLogicalsPass()); // Target-specific peephole cleanups performed after instruction // selection. @@ -543,7 +553,7 @@ void PPCPassConfig::addMachineSSAOptimization() { } void PPCPassConfig::addPreRegAlloc() { - if (getOptLevel() != CodeGenOpt::None) { + if (getOptLevel() != CodeGenOptLevel::None) { initializePPCVSXFMAMutatePass(*PassRegistry::getPassRegistry()); insertPass(VSXFMAMutateEarly ? &RegisterCoalescerID : &MachineSchedulerID, &PPCVSXFMAMutateID); @@ -561,12 +571,12 @@ void PPCPassConfig::addPreRegAlloc() { if (EnableExtraTOCRegDeps) addPass(createPPCTOCRegDepsPass()); - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(&MachinePipelinerID); } void PPCPassConfig::addPreSched2() { - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(&IfConverterID); } @@ -574,7 +584,7 @@ void PPCPassConfig::addPreEmitPass() { addPass(createPPCPreEmitPeepholePass()); addPass(createPPCExpandISELPass()); - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(createPPCEarlyReturnPass()); } |
