2010-07-09 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 8 Jul 2010 23:20:58 +0000 (23:20 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 8 Jul 2010 23:20:58 +0000 (23:20 -0000)
* mini-llvm-cpp.cpp (force_pass_linking): Link in more function passes so
MONO_LLVM=xxx is actually usable.

svn path=/trunk/mono/; revision=160090

mono/mini/ChangeLog
mono/mini/mini-llvm-cpp.cpp

index 24bfe1c16813306635a14074b499aeec506e9ff3..455a7e4ff6643f671e4aef12a23575414ba5e654 100755 (executable)
@@ -1,5 +1,8 @@
 2010-07-09  Zoltan Varga  <vargaz@gmail.com>
 
+       * mini-llvm-cpp.cpp (force_pass_linking): Link in more function passes so
+       MONO_LLVM=xxx is actually usable.
+
        * mini-llvm.c (emit_load): Use the mono specific load intrinsics even outside clauses
        since LLVM might be able to hoist them out of loops.
        (emit_store): Ditto.
index dc42fa4b569f36cade81bfe212dfed2d12f41e36..cff7bfbd9ddf84875bffdc9a74250ca88ea52d16 100644 (file)
@@ -301,11 +301,149 @@ public:
        }
 };
 
+static void
+force_pass_linking (void)
+{
+       // Make sure the rest is linked in, but never executed
+       if (getenv ("FOO") != (char*)-1)
+               return;
+
+       // This is a subset of the passes in LinkAllPasses.h
+       // The utility passes and the interprocedural passes are commented out
+
+      (void) llvm::createAAEvalPass();
+      (void) llvm::createAggressiveDCEPass();
+      (void) llvm::createAliasAnalysisCounterPass();
+      (void) llvm::createAliasDebugger();
+         /*
+      (void) llvm::createArgumentPromotionPass();
+      (void) llvm::createStructRetPromotionPass();
+         */
+      (void) llvm::createBasicAliasAnalysisPass();
+      (void) llvm::createLibCallAliasAnalysisPass(0);
+      (void) llvm::createScalarEvolutionAliasAnalysisPass();
+      (void) llvm::createBlockPlacementPass();
+      (void) llvm::createBreakCriticalEdgesPass();
+      (void) llvm::createCFGSimplificationPass();
+         /*
+      (void) llvm::createConstantMergePass();
+      (void) llvm::createConstantPropagationPass();
+         */
+         /*
+      (void) llvm::createDeadArgEliminationPass();
+         */
+      (void) llvm::createDeadCodeEliminationPass();
+      (void) llvm::createDeadInstEliminationPass();
+      (void) llvm::createDeadStoreEliminationPass();
+         /*
+      (void) llvm::createDeadTypeEliminationPass();
+      (void) llvm::createDomOnlyPrinterPass();
+      (void) llvm::createDomPrinterPass();
+      (void) llvm::createDomOnlyViewerPass();
+      (void) llvm::createDomViewerPass();
+      (void) llvm::createEdgeProfilerPass();
+      (void) llvm::createOptimalEdgeProfilerPass();
+      (void) llvm::createFunctionInliningPass();
+      (void) llvm::createAlwaysInlinerPass();
+      (void) llvm::createGlobalDCEPass();
+      (void) llvm::createGlobalOptimizerPass();
+      (void) llvm::createGlobalsModRefPass();
+      (void) llvm::createIPConstantPropagationPass();
+      (void) llvm::createIPSCCPPass();
+         */
+      (void) llvm::createIndVarSimplifyPass();
+      (void) llvm::createInstructionCombiningPass();
+         /*
+      (void) llvm::createInternalizePass(false);
+         */
+      (void) llvm::createLCSSAPass();
+      (void) llvm::createLICMPass();
+      (void) llvm::createLazyValueInfoPass();
+      (void) llvm::createLiveValuesPass();
+      (void) llvm::createLoopDependenceAnalysisPass();
+         /*
+      (void) llvm::createLoopExtractorPass();
+         */
+      (void) llvm::createLoopSimplifyPass();
+      (void) llvm::createLoopStrengthReducePass();
+      (void) llvm::createLoopUnrollPass();
+      (void) llvm::createLoopUnswitchPass();
+      (void) llvm::createLoopRotatePass();
+      (void) llvm::createLoopIndexSplitPass();
+      (void) llvm::createLowerInvokePass();
+         /*
+      (void) llvm::createLowerSetJmpPass();
+         */
+      (void) llvm::createLowerSwitchPass();
+      (void) llvm::createNoAAPass();
+         /*
+      (void) llvm::createNoProfileInfoPass();
+      (void) llvm::createProfileEstimatorPass();
+      (void) llvm::createProfileVerifierPass();
+      (void) llvm::createProfileLoaderPass();
+         */
+      (void) llvm::createPromoteMemoryToRegisterPass();
+      (void) llvm::createDemoteRegisterToMemoryPass();
+         /*
+      (void) llvm::createPruneEHPass();
+      (void) llvm::createPostDomOnlyPrinterPass();
+      (void) llvm::createPostDomPrinterPass();
+      (void) llvm::createPostDomOnlyViewerPass();
+      (void) llvm::createPostDomViewerPass();
+         */
+      (void) llvm::createReassociatePass();
+      (void) llvm::createSCCPPass();
+      (void) llvm::createScalarReplAggregatesPass();
+      (void) llvm::createSimplifyLibCallsPass();
+      (void) llvm::createSimplifyHalfPowrLibCallsPass();
+         /*
+      (void) llvm::createSingleLoopExtractorPass();
+      (void) llvm::createStripSymbolsPass();
+      (void) llvm::createStripNonDebugSymbolsPass();
+      (void) llvm::createStripDeadDebugInfoPass();
+      (void) llvm::createStripDeadPrototypesPass();
+      (void) llvm::createTailCallEliminationPass();
+      (void) llvm::createTailDuplicationPass();
+      (void) llvm::createJumpThreadingPass();
+         */
+         /*
+      (void) llvm::createUnifyFunctionExitNodesPass();
+         */
+      (void) llvm::createInstCountPass();
+      (void) llvm::createCodeGenPreparePass();
+      (void) llvm::createGVNPass();
+      (void) llvm::createMemCpyOptPass();
+      (void) llvm::createLoopDeletionPass();
+         /*
+      (void) llvm::createPostDomTree();
+      (void) llvm::createPostDomFrontier();
+      (void) llvm::createInstructionNamerPass();
+      (void) llvm::createPartialSpecializationPass();
+      (void) llvm::createFunctionAttrsPass();
+      (void) llvm::createMergeFunctionsPass();
+      (void) llvm::createPrintModulePass(0);
+      (void) llvm::createPrintFunctionPass("", 0);
+      (void) llvm::createDbgInfoPrinterPass();
+      (void) llvm::createModuleDebugInfoPrinterPass();
+      (void) llvm::createPartialInliningPass();
+         */
+      (void) llvm::createSSIPass();
+      (void) llvm::createSSIEverythingPass();
+      (void) llvm::createGEPSplitterPass();
+      (void) llvm::createABCDPass();
+         /*
+      (void) llvm::createLintPass();
+         */
+      (void) llvm::createSinkingPass();
+}
+
 LLVMExecutionEngineRef
 mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, FunctionEmittedCb *emitted_cb, ExceptionTableCb *exception_cb)
 {
   std::string Error;
 
+  force_pass_linking ();
+
   LLVMInitializeX86Target ();
   LLVMInitializeX86TargetInfo ();
 
@@ -333,16 +471,19 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
   fpm = new FunctionPassManager (unwrap (MP));
 
   fpm->add(new TargetData(*EE->getTargetData()));
-  /* Add a random set of passes */
-  /* Make this run-time configurable */
+  /* Add a default set of passes */
   //createStandardFunctionPasses (fpm, 2);
   fpm->add(createInstructionCombiningPass());
   fpm->add(createReassociatePass());
   fpm->add(createGVNPass());
   fpm->add(createCFGSimplificationPass());
 
+  /* The one used by opt is:
+   * -simplifycfg -domtree -domfrontier -scalarrepl -instcombine -simplifycfg -basiccg -domtree -domfrontier -scalarrepl -simplify-libcalls -instcombine -simplifycfg -instcombine -simplifycfg -reassociate -domtree -loops -loopsimplify -domfrontier -loopsimplify -lcssa -loop-rotate -licm -lcssa -loop-unswitch -instcombine -scalar-evolution -loopsimplify -lcssa -iv-users -indvars -loop-deletion -loopsimplify -lcssa -loop-unroll -instcombine -memdep -gvn -memdep -memcpyopt -sccp -instcombine -domtree -memdep -dse -adce -gvn -simplifycfg -preverify -domtree -verify
+   */
+
   /* Add passes specified by the env variable */
-  /* FIXME: This can only add passes which are linked in, thus are already used */
+  /* Only the passes in force_pass_linking () can be used */
   for (unsigned i = 0; i < PassList.size(); ++i) {
       const PassInfo *PassInf = PassList[i];
       Pass *P = 0;