void polly::registerCanonicalicationPasses(llvm::legacy::PassManagerBase &PM) { PM.add(llvm::createPromoteMemoryToRegisterPass()); PM.add(llvm::createInstructionCombiningPass()); PM.add(llvm::createCFGSimplificationPass()); PM.add(llvm::createTailCallEliminationPass()); PM.add(llvm::createCFGSimplificationPass()); PM.add(llvm::createReassociatePass()); PM.add(llvm::createLoopRotatePass()); PM.add(llvm::createInstructionCombiningPass()); PM.add(llvm::createIndVarSimplifyPass()); PM.add(polly::createCodePreparationPass()); }
/// @brief Register Polly passes such that they form a polyhedral optimizer. /// /// The individual Polly passes are registered in the pass manager such that /// they form a full polyhedral optimizer. The flow of the optimizer starts with /// a set of preparing transformations that canonicalize the LLVM-IR such that /// the LLVM-IR is easier for us to understand and to optimizes. On the /// canonicalized LLVM-IR we first run the ScopDetection pass, which detects /// static control flow regions. Those regions are then translated by the /// ScopInfo pass into a polyhedral representation. As a next step, a scheduling /// optimizer is run on the polyhedral representation and finally the optimized /// polyhedral representation is code generated back to LLVM-IR. /// /// Besides this core functionality, we optionally schedule passes that provide /// a graphical view of the scops (Polly[Only]Viewer, Polly[Only]Printer), that /// allow the export/import of the polyhedral representation /// (JSCON[Exporter|Importer]) or that show the cfg after code generation. /// /// For certain parts of the Polly optimizer, several alternatives are provided: /// /// As scheduling optimizer we support the isl scheduling optimizer /// (http://freecode.com/projects/isl). /// It is also possible to run Polly with no optimizer. This mode is mainly /// provided to analyze the run and compile time changes caused by the /// scheduling optimizer. /// /// Polly supports the isl internal code generator. void registerPollyPasses(llvm::legacy::PassManagerBase &PM) { registerCanonicalicationPasses(PM); PM.add(polly::createScopDetectionPass()); if (PollyDetectOnly) return; PM.add(polly::createScopInfoPass()); if (PollyViewer) PM.add(polly::createDOTViewerPass()); if (PollyOnlyViewer) PM.add(polly::createDOTOnlyViewerPass()); if (PollyPrinter) PM.add(polly::createDOTPrinterPass()); if (PollyOnlyPrinter) PM.add(polly::createDOTOnlyPrinterPass()); if (ImportJScop) PM.add(polly::createJSONImporterPass()); if (DeadCodeElim) PM.add(polly::createDeadCodeElimPass()); switch (Optimizer) { case OPTIMIZER_NONE: break; /* Do nothing */ case OPTIMIZER_ISL: PM.add(polly::createIslScheduleOptimizerPass()); break; } if (ExportJScop) PM.add(polly::createJSONExporterPass()); switch (PollyCodeGenChoice) { case CODEGEN_ISL: PM.add(polly::createIslCodeGenerationPass()); break; case CODEGEN_NONE: break; } if (CFGPrinter) PM.add(llvm::createCFGPrinterPass()); }
static void registerSouperPass( const llvm::PassManagerBuilder &Builder, llvm::legacy::PassManagerBase &PM) { PM.add(new SouperPass); }
void registerArcherPasses(llvm::legacy::PassManagerBase &PM) { PM.add(createInstrumentParallelPass()); }