diff options
Diffstat (limited to 'llvm/lib/CodeGen/TargetPassConfig.cpp')
-rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index c31dece..2a90c31 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/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 //===---------------------------------------------------------------------===// @@ -1115,9 +1155,15 @@ void TargetPassConfig::addMachinePasses() { // Add a FSDiscriminator pass right before RA, so that we could get // more precise SampleFDO profile for RA. - if (EnableFSDiscriminator) + 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. @@ -1471,9 +1517,15 @@ bool TargetPassConfig::addGCPasses() { /// Add standard basic block placement passes. void TargetPassConfig::addBlockPlacement() { - if (EnableFSDiscriminator) + 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) |