Add an option to turn off the expensive GVN load PRE part of GVN.
authorBill Wendling <isanbard@gmail.com>
Mon, 2 Apr 2012 22:16:50 +0000 (22:16 +0000)
committerBill Wendling <isanbard@gmail.com>
Mon, 2 Apr 2012 22:16:50 +0000 (22:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153902 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/IPO/PassManagerBuilder.h
lib/Transforms/IPO/PassManagerBuilder.cpp
tools/lto/LTOCodeGenerator.cpp

index 734f37e52eb0a7f486f38ba6317ab53e6876bda6..47ce90265bd5abb685f976f79a63a6def1691a5e 100644 (file)
@@ -131,8 +131,9 @@ public:
   /// populateModulePassManager - This sets up the primary pass manager.
   void populateModulePassManager(PassManagerBase &MPM);
   void populateLTOPassManager(PassManagerBase &PM, bool Internalize,
-                              bool RunInliner);
+                              bool RunInliner, bool DisableGVNLoadPRE = false);
 };
+
 /// Registers a function for adding a standard set of passes.  This should be
 /// used by optimizer plugins to allow all front ends to transparently use
 /// them.  Create a static instance of this class in your plugin, providing a
@@ -143,5 +144,6 @@ struct RegisterStandardPasses {
     PassManagerBuilder::addGlobalExtension(Ty, Fn);
   }
 };
+
 } // end namespace llvm
 #endif
index 243ba1a85bf70d001f6381f2f8ca8cd241a83b7d..a1b0a4580bf508ffa76e3fd7a6c34c47f4b51ed9 100644 (file)
@@ -207,7 +207,8 @@ void PassManagerBuilder::populateModulePassManager(PassManagerBase &MPM) {
 
 void PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM,
                                                 bool Internalize,
-                                                bool RunInliner) {
+                                                bool RunInliner,
+                                                bool DisableGVNLoadPRE) {
   // Provide AliasAnalysis services for optimizations.
   addInitialAliasAnalysisPasses(PM);
 
@@ -263,9 +264,9 @@ void PassManagerBuilder::populateLTOPassManager(PassManagerBase &PM,
   PM.add(createFunctionAttrsPass()); // Add nocapture.
   PM.add(createGlobalsModRefPass()); // IP alias analysis.
 
-  PM.add(createLICMPass());      // Hoist loop invariants.
-  PM.add(createGVNPass());       // Remove redundancies.
-  PM.add(createMemCpyOptPass()); // Remove dead memcpys.
+  PM.add(createLICMPass());                 // Hoist loop invariants.
+  PM.add(createGVNPass(DisableGVNLoadPRE)); // Remove redundancies.
+  PM.add(createMemCpyOptPass());            // Remove dead memcpys.
   // Nuke dead stores.
   PM.add(createDeadStoreEliminationPass());
 
index 1d2631e07d1b33034579020249672db766bf79b7..f0640c220636cccc806610c99790e77fb0d9136c 100644 (file)
@@ -49,6 +49,9 @@ using namespace llvm;
 static cl::opt<bool> DisableInline("disable-inlining",
   cl::desc("Do not run the inliner pass"));
 
+static cl::opt<bool> DisableGVNLoadPRE("disable-gvn-loadpre",
+  cl::desc("Do not run the GVN load PRE pass"));
+
 const char* LTOCodeGenerator::getVersionString() {
 #ifdef LLVM_VERSION_INFO
   return PACKAGE_NAME " version " PACKAGE_VERSION ", " LLVM_VERSION_INFO;
@@ -353,7 +356,8 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out,
   passes.add(new TargetData(*_target->getTargetData()));
 
   PassManagerBuilder().populateLTOPassManager(passes, /*Internalize=*/ false,
-                                              !DisableInline);
+                                              !DisableInline,
+                                              DisableGVNLoadPRE);
 
   // Make sure everything is still good.
   passes.add(createVerifierPass());