diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetPassConfig.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index 98ea2f21b3c8..1f7c949cd603 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -250,6 +250,11 @@ static cl::opt<bool> DisableSelectOptimize( "disable-select-optimize", cl::init(true), cl::Hidden, cl::desc("Disable the select-optimization pass from running")); +/// Enable garbage-collecting empty basic blocks. +static cl::opt<bool> + GCEmptyBlocks("gc-empty-basic-blocks", cl::init(false), cl::Hidden, + cl::desc("Enable garbage-collecting empty basic blocks")); + /// Allow standard passes to be disabled by command line options. This supports /// simple binary flags that either suppress the pass or do nothing. /// i.e. -disable-mypass=false has no effect. @@ -626,7 +631,7 @@ TargetPassConfig::TargetPassConfig(LLVMTargetMachine &TM, PassManagerBase &pm) setStartStopPasses(); } -CodeGenOpt::Level TargetPassConfig::getOptLevel() const { +CodeGenOptLevel TargetPassConfig::getOptLevel() const { return TM->getOptLevel(); } @@ -841,7 +846,7 @@ void TargetPassConfig::addIRPasses() { if (!DisableVerify) addPass(createVerifierPass()); - if (getOptLevel() != CodeGenOpt::None) { + if (getOptLevel() != CodeGenOptLevel::None) { // Basic AliasAnalysis support. // Add TypeBasedAliasAnalysis before BasicAliasAnalysis so that // BasicAliasAnalysis wins if they disagree. This is intended to help @@ -884,13 +889,13 @@ void TargetPassConfig::addIRPasses() { addPass(createUnreachableBlockEliminationPass()); // Prepare expensive constants for SelectionDAG. - if (getOptLevel() != CodeGenOpt::None && !DisableConstantHoisting) + if (getOptLevel() != CodeGenOptLevel::None && !DisableConstantHoisting) addPass(createConstantHoistingPass()); - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(createReplaceWithVeclibLegacyPass()); - if (getOptLevel() != CodeGenOpt::None && !DisablePartialLibcallInlining) + if (getOptLevel() != CodeGenOptLevel::None && !DisablePartialLibcallInlining) addPass(createPartiallyInlineLibCallsPass()); // Expand vector predication intrinsics into standard IR instructions. @@ -908,11 +913,11 @@ void TargetPassConfig::addIRPasses() { if (!DisableExpandReductions) addPass(createExpandReductionsPass()); - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addPass(createTLSVariableHoistPass()); // Convert conditional moves to conditional jumps when profitable. - if (getOptLevel() != CodeGenOpt::None && !DisableSelectOptimize) + if (getOptLevel() != CodeGenOptLevel::None && !DisableSelectOptimize) addPass(createSelectOptimizePass()); } @@ -963,7 +968,7 @@ void TargetPassConfig::addPassesToHandleExceptions() { /// Add pass to prepare the LLVM IR for code generation. This should be done /// before exception handling preparation passes. void TargetPassConfig::addCodeGenPrepare() { - if (getOptLevel() != CodeGenOpt::None && !DisableCGP) + if (getOptLevel() != CodeGenOptLevel::None && !DisableCGP) addPass(createCodeGenPreparePass()); } @@ -1007,7 +1012,8 @@ bool TargetPassConfig::addCoreISelPasses() { (TM->Options.EnableGlobalISel && EnableGlobalISelOption != cl::BOU_FALSE)) Selector = SelectorType::GlobalISel; - else if (TM->getOptLevel() == CodeGenOpt::None && TM->getO0WantsFastISel()) + else if (TM->getOptLevel() == CodeGenOptLevel::None && + TM->getO0WantsFastISel()) Selector = SelectorType::FastISel; else Selector = SelectorType::SelectionDAG; @@ -1124,7 +1130,7 @@ void TargetPassConfig::addMachinePasses() { AddingMachinePasses = true; // Add passes that optimize machine instructions in SSA form. - if (getOptLevel() != CodeGenOpt::None) { + if (getOptLevel() != CodeGenOptLevel::None) { addMachineSSAOptimization(); } else { // If the target requests it, assign local variables to stack slots relative @@ -1170,7 +1176,7 @@ void TargetPassConfig::addMachinePasses() { addPass(&FixupStatepointCallerSavedID); // Insert prolog/epilog code. Eliminate abstract frame index references... - if (getOptLevel() != CodeGenOpt::None) { + if (getOptLevel() != CodeGenOptLevel::None) { addPass(&PostRAMachineSinkingID); addPass(&ShrinkWrapID); } @@ -1181,8 +1187,8 @@ void TargetPassConfig::addMachinePasses() { addPass(createPrologEpilogInserterPass()); /// Add passes that optimize machine instructions after register allocation. - if (getOptLevel() != CodeGenOpt::None) - addMachineLateOptimization(); + if (getOptLevel() != CodeGenOptLevel::None) + addMachineLateOptimization(); // Expand pseudo instructions before second scheduling pass. addPass(&ExpandPostRAPseudosID); @@ -1196,7 +1202,7 @@ void TargetPassConfig::addMachinePasses() { // Second pass scheduler. // Let Target optionally insert this pass by itself at some other // point. - if (getOptLevel() != CodeGenOpt::None && + if (getOptLevel() != CodeGenOptLevel::None && !TM->targetSchedulesPostRAScheduling()) { if (MISchedPostRA) addPass(&PostMachineSchedulerID); @@ -1211,7 +1217,7 @@ void TargetPassConfig::addMachinePasses() { } // Basic block placement. - if (getOptLevel() != CodeGenOpt::None) + if (getOptLevel() != CodeGenOptLevel::None) addBlockPlacement(); // Insert before XRay Instrumentation. @@ -1235,7 +1241,8 @@ void TargetPassConfig::addMachinePasses() { addPass(&LiveDebugValuesID); addPass(&MachineSanitizerBinaryMetadataID); - if (TM->Options.EnableMachineOutliner && getOptLevel() != CodeGenOpt::None && + if (TM->Options.EnableMachineOutliner && + getOptLevel() != CodeGenOptLevel::None && EnableMachineOutliner != RunOutliner::NeverOutline) { bool RunOnAllFunctions = (EnableMachineOutliner == RunOutliner::AlwaysOutline); @@ -1245,6 +1252,9 @@ void TargetPassConfig::addMachinePasses() { addPass(createMachineOutlinerPass(RunOnAllFunctions)); } + if (GCEmptyBlocks) + addPass(llvm::createGCEmptyBasicBlocksPass()); + if (EnableFSDiscriminator) addPass(createMIRAddFSDiscriminatorsPass( sampleprof::FSDiscriminatorPass::PassLast)); @@ -1257,6 +1267,7 @@ void TargetPassConfig::addMachinePasses() { if (TM->getBBSectionsType() == llvm::BasicBlockSection::List) { addPass(llvm::createBasicBlockSectionsProfileReaderPass( TM->getBBSectionsFuncListBuf())); + addPass(llvm::createBasicBlockPathCloningPass()); } addPass(llvm::createBasicBlockSectionsPass()); } else if (TM->Options.EnableMachineFunctionSplitter || @@ -1336,7 +1347,8 @@ void TargetPassConfig::addMachineSSAOptimization() { bool TargetPassConfig::getOptimizeRegAlloc() const { switch (OptimizeRegAlloc) { - case cl::BOU_UNSET: return getOptLevel() != CodeGenOpt::None; + case cl::BOU_UNSET: + return getOptLevel() != CodeGenOptLevel::None; case cl::BOU_TRUE: return true; case cl::BOU_FALSE: return false; } |
