Index: lib/Transforms/IPO/PassManagerBuilder.cpp =================================================================== --- lib/Transforms/IPO/PassManagerBuilder.cpp +++ lib/Transforms/IPO/PassManagerBuilder.cpp @@ -567,6 +567,10 @@ } void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) { + // Remove unused virtual tables to improve the quality of code generated by + // whole-program devirtualization and bitset lowering. + PM.add(createGlobalDCEPass()); + // Provide AliasAnalysis services for optimizations. addInitialAliasAnalysisPasses(PM); @@ -585,14 +589,26 @@ // produce the same result as if we only do promotion here. PM.add(createPGOIndirectCallPromotionLegacyPass(true)); - // Propagate constants at call sites into the functions they call. This - // opens opportunities for globalopt (and inlining) by substituting function - // pointers passed as arguments to direct uses of functions. - PM.add(createIPSCCPPass()); + if (OptLevel > 1) { + // Propagate constants at call sites into the functions they call. This + // opens opportunities for globalopt (and inlining) by substituting function + // pointers passed as arguments to direct uses of functions. + PM.add(createIPSCCPPass()); + } - // Now that we internalized some globals, see if we can hack on them! + // Infer attributes about definitions. The readnone attribute in particular is + // required for virtual constant propagation. PM.add(createPostOrderFunctionAttrsLegacyPass()); PM.add(createReversePostOrderFunctionAttrsPass()); + + // Apply whole-program devirtualization and virtual constant propagation. + PM.add(createWholeProgramDevirtPass()); + + // That's all we need at opt level 1. + if (OptLevel == 1) + return; + + // Now that we internalized some globals, see if we can hack on them! PM.add(createGlobalOptimizerPass()); // Promote any localized global vars. PM.add(createPromoteMemoryToRegisterPass()); @@ -694,16 +710,6 @@ PM.add(createJumpThreadingPass()); } -void PassManagerBuilder::addEarlyLTOOptimizationPasses( - legacy::PassManagerBase &PM) { - // Remove unused virtual tables to improve the quality of code generated by - // whole-program devirtualization and bitset lowering. - PM.add(createGlobalDCEPass()); - - // Apply whole-program devirtualization and virtual constant propagation. - PM.add(createWholeProgramDevirtPass()); -} - void PassManagerBuilder::addLateLTOOptimizationPasses( legacy::PassManagerBase &PM) { // Delete basic blocks, which optimization passes may have killed. @@ -746,9 +752,6 @@ PM.add(createVerifierPass()); if (OptLevel != 0) - addEarlyLTOOptimizationPasses(PM); - - if (OptLevel > 1) addLTOOptimizationPasses(PM); // Create a function that performs CFI checks for cross-DSO calls with targets