PrepareForLTO = false;
PGOInstrGen = RunPGOInstrGen;
PGOInstrUse = RunPGOInstrUse;
- PrepareForThinLTO = false;
- PerformThinLTO = false;
}
PassManagerBuilder::~PassManagerBuilder() {
MPM.add(createTailCallEliminationPass()); // Eliminate tail calls
MPM.add(createCFGSimplificationPass()); // Merge & remove BBs
MPM.add(createReassociatePass()); // Reassociate expressions
- if (PrepareForThinLTO) {
- MPM.add(createAggressiveDCEPass()); // Delete dead instructions
- MPM.add(createInstructionCombiningPass()); // Combine silly seq's
- return;
- }
// Rotate Loop - disable header duplication at -Oz
MPM.add(createLoopRotatePass(SizeLevel == 2 ? 0 : -1));
MPM.add(createLICMPass()); // Hoist loop invariants
MPM.add(createIPSCCPPass()); // IP SCCP
MPM.add(createGlobalOptimizerPass()); // Optimize out global vars
-
- if (PerformThinLTO)
- // Linking modules together can lead to duplicated global constants, only
- // keep one copy of each constant.
- MPM.add(createConstantMergePass());
-
// Promote any localized global vars
MPM.add(createPromoteMemoryToRegisterPass());
addFunctionSimplificationPasses(MPM);
- // If we are planning to perform ThinLTO later, let's not bloat the code with
- // unrolling/vectorization/... now. We'll first run the inliner + CGSCC passes
- // during ThinLTO and performs the rest of the optimizations afterward.
- if (PrepareForThinLTO)
- return;
-
// FIXME: This is a HACK! The inliner pass above implicitly creates a CGSCC
// pass manager that we are specifically trying to avoid. To prevent this
// we must insert a no-op module pass to reset the pass manager.
if (!DisableUnitAtATime)
MPM.add(createReversePostOrderFunctionAttrsPass());
- if (!DisableUnitAtATime && OptLevel > 1 && !PrepareForLTO)
+ if (!DisableUnitAtATime && OptLevel > 1 && !PrepareForLTO) {
// Remove avail extern fns and globals definitions if we aren't
// compiling an object file for later LTO. For LTO we want to preserve
// these so they are eligible for inlining at link-time. Note if they
// globals referenced by available external functions dead
// and saves running remaining passes on the eliminated functions.
MPM.add(createEliminateAvailableExternallyPass());
-
- if (PerformThinLTO) {
- // Remove dead fns and globals. Removing unreferenced functions could lead
- // to more opportunities for globalopt
- MPM.add(createGlobalDCEPass());
- MPM.add(createGlobalOptimizerPass());
- // Remove dead fns and globals after globalopt
- MPM.add(createGlobalDCEPass());
- addFunctionSimplificationPasses(MPM);
}
if (EnableNonLTOGlobalsModRef)
PM.add(createMergeFunctionsPass());
}
-void PassManagerBuilder::populateThinLTOPassManager(
- legacy::PassManagerBase &PM) {
- PerformThinLTO = true;
-
- if (VerifyInput)
- PM.add(createVerifierPass());
-
- populateModulePassManager(PM);
-
- if (VerifyOutput)
- PM.add(createVerifierPass());
- PerformThinLTO = false;
-}
-
void PassManagerBuilder::populateLTOPassManager(legacy::PassManagerBase &PM) {
if (LibraryInfo)
PM.add(new TargetLibraryInfoWrapperPass(*LibraryInfo));