diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/PassManagerBuilder.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/PassManagerBuilder.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp index 3ea77f08fd3..d06dadec362 100644 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -246,6 +246,18 @@ void PassManagerBuilder::addInstructionCombiningPass( PM.add(createInstructionCombiningPass(ExpensiveCombines)); } +void PassManagerBuilder::addMemcmpPasses(legacy::PassManagerBase &PM) const { + if (OptLevel > 0) { + // The MergeICmpsPass tries to create memcmp calls by grouping sequences of + // loads and compares. ExpandMemCmpPass then tries to expand those calls + // into optimally-sized loads and compares. The transforms are enabled by a + // target transform info hook. + PM.add(createMergeICmpsLegacyPass()); + PM.add(createExpandMemCmpPass()); + PM.add(createEarlyCSEPass()); + } +} + void PassManagerBuilder::populateFunctionPassManager( legacy::FunctionPassManager &FPM) { addExtensionsToPM(EP_EarlyAsPossible, FPM); @@ -409,6 +421,7 @@ void PassManagerBuilder::addFunctionSimplificationPasses( addExtensionsToPM(EP_ScalarOptimizerLate, MPM); + addMemcmpPasses(MPM); // Merge/Expand comparisons. if (RerollLoops) MPM.add(createLoopRerollPass()); @@ -910,6 +923,7 @@ void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) { PM.add(NewGVN ? createNewGVNPass() : createGVNPass(DisableGVNLoadPRE)); // Remove redundancies. PM.add(createMemCpyOptPass()); // Remove dead memcpys. + addMemcmpPasses(PM); // Merge/Expand comparisons. // Nuke dead stores. PM.add(createDeadStoreEliminationPass()); |