diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp | 130 |
1 files changed, 89 insertions, 41 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp b/contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp index 4024fd452fc4..402e21d3708b 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -172,6 +172,24 @@ static cl::opt<bool> FSNoFinalDiscrim("fs-no-final-discrim", cl::init(false), cl::Hidden, cl::desc("Do not insert FS-AFDO discriminators before " "emit.")); +// Disable MIRProfileLoader before RegAlloc. This is for for debugging and +// tuning purpose. +static cl::opt<bool> DisableRAFSProfileLoader( + "disable-ra-fsprofile-loader", cl::init(true), cl::Hidden, + cl::desc("Disable MIRProfileLoader before RegAlloc")); +// Disable MIRProfileLoader before BloackPlacement. This is for for debugging +// and tuning purpose. +static cl::opt<bool> DisableLayoutFSProfileLoader( + "disable-layout-fsprofile-loader", cl::init(true), cl::Hidden, + cl::desc("Disable MIRProfileLoader before BlockPlacement")); +// Specify FSProfile file name. +static cl::opt<std::string> + FSProfileFile("fs-profile-file", cl::init(""), cl::value_desc("filename"), + cl::desc("Flow Sensitive profile file name."), cl::Hidden); +// Specify Remapping file for FSProfile. +static cl::opt<std::string> FSRemappingFile( + "fs-remapping-file", cl::init(""), cl::value_desc("filename"), + cl::desc("Flow Sensitive profile remapping file name."), cl::Hidden); // Temporary option to allow experimenting with MachineScheduler as a post-RA // scheduler. Targets can "properly" enable this with @@ -308,6 +326,28 @@ static IdentifyingPassPtr overridePass(AnalysisID StandardID, return TargetID; } +// Find the FSProfile file name. The internal option takes the precedence +// before getting from TargetMachine. +static const std::string getFSProfileFile(const TargetMachine *TM) { + if (!FSProfileFile.empty()) + return FSProfileFile.getValue(); + const Optional<PGOOptions> &PGOOpt = TM->getPGOOption(); + if (PGOOpt == None || PGOOpt->Action != PGOOptions::SampleUse) + return std::string(); + return PGOOpt->ProfileFile; +} + +// Find the Profile remapping file name. The internal option takes the +// precedence before getting from TargetMachine. +static const std::string getFSRemappingFile(const TargetMachine *TM) { + if (!FSRemappingFile.empty()) + return FSRemappingFile.getValue(); + const Optional<PGOOptions> &PGOOpt = TM->getPGOOption(); + if (PGOOpt == None || PGOOpt->Action != PGOOptions::SampleUse) + return std::string(); + return PGOOpt->ProfileRemappingFile; +} + //===---------------------------------------------------------------------===// /// TargetPassConfig //===---------------------------------------------------------------------===// @@ -321,12 +361,9 @@ namespace { struct InsertedPass { AnalysisID TargetPassID; IdentifyingPassPtr InsertedPassID; - bool VerifyAfter; - InsertedPass(AnalysisID TargetPassID, IdentifyingPassPtr InsertedPassID, - bool VerifyAfter) - : TargetPassID(TargetPassID), InsertedPassID(InsertedPassID), - VerifyAfter(VerifyAfter) {} + InsertedPass(AnalysisID TargetPassID, IdentifyingPassPtr InsertedPassID) + : TargetPassID(TargetPassID), InsertedPassID(InsertedPassID) {} Pass *getInsertedPass() const { assert(InsertedPassID.isValid() && "Illegal Pass ID!"); @@ -601,14 +638,13 @@ CodeGenOpt::Level TargetPassConfig::getOptLevel() const { /// Insert InsertedPassID pass after TargetPassID. void TargetPassConfig::insertPass(AnalysisID TargetPassID, - IdentifyingPassPtr InsertedPassID, - bool VerifyAfter) { + IdentifyingPassPtr InsertedPassID) { assert(((!InsertedPassID.isInstance() && TargetPassID != InsertedPassID.getID()) || (InsertedPassID.isInstance() && TargetPassID != InsertedPassID.getInstance()->getPassID())) && "Insert a pass after itself!"); - Impl->InsertedPasses.emplace_back(TargetPassID, InsertedPassID, VerifyAfter); + Impl->InsertedPasses.emplace_back(TargetPassID, InsertedPassID); } /// createPassConfig - Create a pass configuration object to be used by @@ -686,7 +722,7 @@ bool TargetPassConfig::isPassSubstitutedOrOverridden(AnalysisID ID) const { /// a later pass or that it should stop after an earlier pass, then do not add /// the pass. Finally, compare the current pass against the StartAfter /// and StopAfter options and change the Started/Stopped flags accordingly. -void TargetPassConfig::addPass(Pass *P, bool verifyAfter) { +void TargetPassConfig::addPass(Pass *P) { assert(!Initialized && "PassConfig is immutable"); // Cache the Pass ID here in case the pass manager finds this pass is @@ -704,16 +740,16 @@ void TargetPassConfig::addPass(Pass *P, bool verifyAfter) { addMachinePrePasses(); std::string Banner; // Construct banner message before PM->add() as that may delete the pass. - if (AddingMachinePasses && verifyAfter) + if (AddingMachinePasses) Banner = std::string("After ") + std::string(P->getPassName()); PM->add(P); if (AddingMachinePasses) - addMachinePostPasses(Banner, /*AllowVerify*/ verifyAfter); + addMachinePostPasses(Banner); // Add the passes after the pass P if there is any. for (const auto &IP : Impl->InsertedPasses) { if (IP.TargetPassID == PassID) - addPass(IP.getInsertedPass(), IP.VerifyAfter); + addPass(IP.getInsertedPass()); } } else { delete P; @@ -733,7 +769,7 @@ void TargetPassConfig::addPass(Pass *P, bool verifyAfter) { /// /// addPass cannot return a pointer to the pass instance because is internal the /// PassManager and the instance we create here may already be freed. -AnalysisID TargetPassConfig::addPass(AnalysisID PassID, bool verifyAfter) { +AnalysisID TargetPassConfig::addPass(AnalysisID PassID) { IdentifyingPassPtr TargetID = getPassSubstitution(PassID); IdentifyingPassPtr FinalPtr = overridePass(PassID, TargetID); if (!FinalPtr.isValid()) @@ -748,7 +784,7 @@ AnalysisID TargetPassConfig::addPass(AnalysisID PassID, bool verifyAfter) { llvm_unreachable("Pass ID not registered"); } AnalysisID FinalID = P->getPassID(); - addPass(P, verifyAfter); // Ends the lifetime of P. + addPass(P); // Ends the lifetime of P. return FinalID; } @@ -792,8 +828,7 @@ void TargetPassConfig::addMachinePrePasses(bool AllowDebugify) { addDebugifyPass(); } -void TargetPassConfig::addMachinePostPasses(const std::string &Banner, - bool AllowVerify, bool AllowStrip) { +void TargetPassConfig::addMachinePostPasses(const std::string &Banner) { if (DebugifyIsSafe) { if (DebugifyCheckAndStripAll == cl::BOU_TRUE) { addCheckDebugPass(); @@ -801,8 +836,7 @@ void TargetPassConfig::addMachinePostPasses(const std::string &Banner, } else if (DebugifyAndStripAll == cl::BOU_TRUE) addStripDebugPass(); } - if (AllowVerify) - addVerifyPass(Banner); + addVerifyPass(Banner); } /// Add common target configurable passes that perform LLVM IR to IR transforms @@ -1113,6 +1147,18 @@ void TargetPassConfig::addMachinePasses() { // where it becomes safe again so stop debugifying here. DebugifyIsSafe = false; + // Add a FSDiscriminator pass right before RA, so that we could get + // more precise SampleFDO profile for RA. + if (EnableFSDiscriminator) { + addPass(createMIRAddFSDiscriminatorsPass( + sampleprof::FSDiscriminatorPass::Pass1)); + const std::string ProfileFile = getFSProfileFile(TM); + if (!ProfileFile.empty() && !DisableRAFSProfileLoader) + addPass( + createMIRProfileLoaderPass(ProfileFile, getFSRemappingFile(TM), + sampleprof::FSDiscriminatorPass::Pass1)); + } + // Run register allocation and passes that are tightly coupled with it, // including phi elimination and scheduling. if (getOptimizeRegAlloc()) @@ -1123,7 +1169,7 @@ void TargetPassConfig::addMachinePasses() { // Run post-ra passes. addPostRegAlloc(); - addPass(&RemoveRedundantDebugValuesID, false); + addPass(&RemoveRedundantDebugValuesID); addPass(&FixupStatepointCallerSavedID); @@ -1165,7 +1211,7 @@ void TargetPassConfig::addMachinePasses() { // GC if (addGCPasses()) { if (PrintGCInfo) - addPass(createGCInfoPrinter(dbgs()), false); + addPass(createGCInfoPrinter(dbgs())); } // Basic block placement. @@ -1195,10 +1241,10 @@ void TargetPassConfig::addMachinePasses() { // FIXME: Some backends are incompatible with running the verifier after // addPreEmitPass. Maybe only pass "false" here for those targets? - addPass(&FuncletLayoutID, false); + addPass(&FuncletLayoutID); - addPass(&StackMapLivenessID, false); - addPass(&LiveDebugValuesID, false); + addPass(&StackMapLivenessID); + addPass(&LiveDebugValuesID); if (TM->Options.EnableMachineOutliner && getOptLevel() != CodeGenOpt::None && EnableMachineOutliner != RunOutliner::NeverOutline) { @@ -1224,10 +1270,6 @@ void TargetPassConfig::addMachinePasses() { // Add passes that directly emit MI after all other MI passes. addPreEmitPass2(); - // Insert pseudo probe annotation for callsite profiling - if (TM->Options.PseudoProbeForProfiling) - addPass(createPseudoProbeInserter()); - AddingMachinePasses = false; } @@ -1369,8 +1411,8 @@ bool TargetPassConfig::usingDefaultRegAlloc() const { /// Add the minimum set of target-independent passes that are required for /// register allocation. No coalescing or scheduling. void TargetPassConfig::addFastRegAlloc() { - addPass(&PHIEliminationID, false); - addPass(&TwoAddressInstructionPassID, false); + addPass(&PHIEliminationID); + addPass(&TwoAddressInstructionPassID); addRegAssignAndRewriteFast(); } @@ -1379,9 +1421,9 @@ void TargetPassConfig::addFastRegAlloc() { /// optimized register allocation, including coalescing, machine instruction /// scheduling, and register allocation itself. void TargetPassConfig::addOptimizedRegAlloc() { - addPass(&DetectDeadLanesID, false); + addPass(&DetectDeadLanesID); - addPass(&ProcessImplicitDefsID, false); + addPass(&ProcessImplicitDefsID); // LiveVariables currently requires pure SSA form. // @@ -1393,18 +1435,18 @@ void TargetPassConfig::addOptimizedRegAlloc() { // When LiveVariables is removed this has to be removed/moved either. // Explicit addition of UnreachableMachineBlockElim allows stopping before or // after it with -stop-before/-stop-after. - addPass(&UnreachableMachineBlockElimID, false); - addPass(&LiveVariablesID, false); + addPass(&UnreachableMachineBlockElimID); + addPass(&LiveVariablesID); // Edge splitting is smarter with machine loop info. - addPass(&MachineLoopInfoID, false); - addPass(&PHIEliminationID, false); + addPass(&MachineLoopInfoID); + addPass(&PHIEliminationID); // Eventually, we want to run LiveIntervals before PHI elimination. if (EarlyLiveIntervals) - addPass(&LiveIntervalsID, false); + addPass(&LiveIntervalsID); - addPass(&TwoAddressInstructionPassID, false); + addPass(&TwoAddressInstructionPassID); addPass(&RegisterCoalescerID); // The machine scheduler may accidentally create disconnected components @@ -1417,9 +1459,6 @@ void TargetPassConfig::addOptimizedRegAlloc() { if (addRegAssignAndRewriteOptimized()) { // Perform stack slot coloring and post-ra machine LICM. - // - // FIXME: Re-enable coloring with register when it's capable of adding - // kill markers. addPass(&StackSlotColoringID); // Allow targets to expand pseudo instructions depending on the choice of @@ -1459,12 +1498,21 @@ void TargetPassConfig::addMachineLateOptimization() { /// Add standard GC passes. bool TargetPassConfig::addGCPasses() { - addPass(&GCMachineCodeAnalysisID, false); + addPass(&GCMachineCodeAnalysisID); return true; } /// Add standard basic block placement passes. void TargetPassConfig::addBlockPlacement() { + if (EnableFSDiscriminator) { + addPass(createMIRAddFSDiscriminatorsPass( + sampleprof::FSDiscriminatorPass::Pass2)); + const std::string ProfileFile = getFSProfileFile(TM); + if (!ProfileFile.empty() && !DisableLayoutFSProfileLoader) + addPass( + createMIRProfileLoaderPass(ProfileFile, getFSRemappingFile(TM), + sampleprof::FSDiscriminatorPass::Pass2)); + } if (addPass(&MachineBlockPlacementID)) { // Run a separate pass to collect block placement statistics. if (EnableBlockPlacementStats) |
