Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 1 | //===------ CodeGeneration.cpp - Code generate the Scops using ISL. ----======// |
Sebastian Pop | 082cea8 | 2012-05-07 16:20:07 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 10 | // The CodeGeneration pass takes a Scop created by ScopInfo and translates it |
Sebastian Pop | 082cea8 | 2012-05-07 16:20:07 +0000 | [diff] [blame] | 11 | // back to LLVM-IR using the ISL code generator. |
| 12 | // |
| 13 | // The Scop describes the high level memory behaviour of a control flow region. |
| 14 | // Transformation passes can update the schedule (execution order) of statements |
| 15 | // in the Scop. ISL is used to generate an abstract syntax tree that reflects |
| 16 | // the updated execution order. This clast is used to create new LLVM-IR that is |
| 17 | // computationally equivalent to the original control flow region, but executes |
Tobias Grosser | 5483931 | 2015-04-21 11:37:25 +0000 | [diff] [blame] | 18 | // its code in the new execution order defined by the changed schedule. |
Sebastian Pop | 082cea8 | 2012-05-07 16:20:07 +0000 | [diff] [blame] | 19 | // |
| 20 | //===----------------------------------------------------------------------===// |
Tobias Grosser | f3ba5b5 | 2015-04-27 12:17:22 +0000 | [diff] [blame] | 21 | |
Tobias Grosser | 8362818 | 2013-05-07 08:11:54 +0000 | [diff] [blame] | 22 | #include "polly/CodeGen/IslAst.h" |
Tobias Grosser | 5624d3c | 2015-12-21 12:38:56 +0000 | [diff] [blame] | 23 | #include "polly/CodeGen/IslNodeBuilder.h" |
Tobias Grosser | 65371af | 2017-04-03 14:55:37 +0000 | [diff] [blame^] | 24 | #include "polly/CodeGen/PerfMonitor.h" |
Tobias Grosser | 8362818 | 2013-05-07 08:11:54 +0000 | [diff] [blame] | 25 | #include "polly/CodeGen/Utils.h" |
Johannes Doerfert | f6557f9 | 2015-03-04 22:43:40 +0000 | [diff] [blame] | 26 | #include "polly/DependenceInfo.h" |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 27 | #include "polly/LinkAllPasses.h" |
Tobias Grosser | 58e5854 | 2016-02-19 11:07:12 +0000 | [diff] [blame] | 28 | #include "polly/Options.h" |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 29 | #include "polly/ScopInfo.h" |
Tobias Grosser | 0ee50f6 | 2013-04-10 06:55:31 +0000 | [diff] [blame] | 30 | #include "polly/Support/ScopHelper.h" |
Chandler Carruth | 66ef16b | 2015-09-09 22:13:56 +0000 | [diff] [blame] | 31 | #include "llvm/Analysis/AliasAnalysis.h" |
| 32 | #include "llvm/Analysis/BasicAliasAnalysis.h" |
| 33 | #include "llvm/Analysis/GlobalsModRef.h" |
Chandler Carruth | 66ef16b | 2015-09-09 22:13:56 +0000 | [diff] [blame] | 34 | #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" |
Tobias Grosser | c2bb0cb | 2015-09-25 09:49:19 +0000 | [diff] [blame] | 35 | #include "llvm/IR/Module.h" |
| 36 | #include "llvm/IR/Verifier.h" |
| 37 | #include "llvm/Support/Debug.h" |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 38 | |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 39 | using namespace polly; |
| 40 | using namespace llvm; |
| 41 | |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 42 | #define DEBUG_TYPE "polly-codegen" |
Chandler Carruth | 95fef94 | 2014-04-22 03:30:19 +0000 | [diff] [blame] | 43 | |
Tobias Grosser | 58e5854 | 2016-02-19 11:07:12 +0000 | [diff] [blame] | 44 | static cl::opt<bool> Verify("polly-codegen-verify", |
| 45 | cl::desc("Verify the function generated by Polly"), |
| 46 | cl::Hidden, cl::init(true), cl::ZeroOrMore, |
| 47 | cl::cat(PollyCategory)); |
| 48 | |
Tobias Grosser | 65371af | 2017-04-03 14:55:37 +0000 | [diff] [blame^] | 49 | static cl::opt<bool> |
| 50 | PerfMonitoring("polly-codegen-perf-monitoring", |
| 51 | cl::desc("Add run-time performance monitoring"), cl::Hidden, |
| 52 | cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); |
| 53 | |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 54 | namespace { |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 55 | class CodeGeneration : public ScopPass { |
Tobias Grosser | 1bb59b0 | 2012-12-29 23:47:38 +0000 | [diff] [blame] | 56 | public: |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 57 | static char ID; |
| 58 | |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 59 | CodeGeneration() : ScopPass(ID) {} |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 60 | |
Tobias Grosser | c80d697 | 2016-09-02 06:33:33 +0000 | [diff] [blame] | 61 | /// The datalayout used |
Tobias Grosser | e3c0558 | 2014-11-15 21:32:53 +0000 | [diff] [blame] | 62 | const DataLayout *DL; |
| 63 | |
Johannes Doerfert | 3826224 | 2014-09-10 14:50:23 +0000 | [diff] [blame] | 64 | /// @name The analysis passes we need to generate code. |
| 65 | /// |
| 66 | ///{ |
| 67 | LoopInfo *LI; |
| 68 | IslAstInfo *AI; |
| 69 | DominatorTree *DT; |
| 70 | ScalarEvolution *SE; |
Michael Kruse | 2237088 | 2015-08-11 14:39:21 +0000 | [diff] [blame] | 71 | RegionInfo *RI; |
Johannes Doerfert | 3826224 | 2014-09-10 14:50:23 +0000 | [diff] [blame] | 72 | ///} |
| 73 | |
Tobias Grosser | 58e5854 | 2016-02-19 11:07:12 +0000 | [diff] [blame] | 74 | void verifyGeneratedFunction(Scop &S, Function &F) { |
| 75 | if (!verifyFunction(F, &errs()) || !Verify) |
| 76 | return; |
Johannes Doerfert | 0b169c0 | 2015-02-27 17:37:05 +0000 | [diff] [blame] | 77 | |
| 78 | DEBUG({ |
| 79 | errs() << "== ISL Codegen created an invalid function ==\n\n== The " |
| 80 | "SCoP ==\n"; |
| 81 | S.print(errs()); |
| 82 | errs() << "\n== The isl AST ==\n"; |
Johannes Doerfert | 3fe584d | 2015-03-01 18:40:25 +0000 | [diff] [blame] | 83 | AI->printScop(errs(), S); |
Johannes Doerfert | 0b169c0 | 2015-02-27 17:37:05 +0000 | [diff] [blame] | 84 | errs() << "\n== The invalid function ==\n"; |
| 85 | F.print(errs()); |
Johannes Doerfert | 0b169c0 | 2015-02-27 17:37:05 +0000 | [diff] [blame] | 86 | }); |
| 87 | |
Tobias Grosser | 58e5854 | 2016-02-19 11:07:12 +0000 | [diff] [blame] | 88 | llvm_unreachable("Polly generated function could not be verified. Add " |
| 89 | "-polly-codegen-verify=false to disable this assertion."); |
Johannes Doerfert | 0b169c0 | 2015-02-27 17:37:05 +0000 | [diff] [blame] | 90 | } |
| 91 | |
Michael Kruse | 9c483c5 | 2015-08-11 14:47:37 +0000 | [diff] [blame] | 92 | // CodeGeneration adds a lot of BBs without updating the RegionInfo |
| 93 | // We make all created BBs belong to the scop's parent region without any |
| 94 | // nested structure to keep the RegionInfo verifier happy. |
| 95 | void fixRegionInfo(Function *F, Region *ParentRegion) { |
| 96 | for (BasicBlock &BB : *F) { |
| 97 | if (RI->getRegionFor(&BB)) |
| 98 | continue; |
| 99 | |
| 100 | RI->setRegionFor(&BB, ParentRegion); |
| 101 | } |
| 102 | } |
| 103 | |
Tobias Grosser | c80d697 | 2016-09-02 06:33:33 +0000 | [diff] [blame] | 104 | /// Mark a basic block unreachable. |
Tobias Grosser | bfb6a96 | 2016-03-23 06:57:51 +0000 | [diff] [blame] | 105 | /// |
| 106 | /// Marks the basic block @p Block unreachable by equipping it with an |
| 107 | /// UnreachableInst. |
| 108 | void markBlockUnreachable(BasicBlock &Block, PollyIRBuilder &Builder) { |
| 109 | auto *OrigTerminator = Block.getTerminator(); |
| 110 | Builder.SetInsertPoint(OrigTerminator); |
| 111 | Builder.CreateUnreachable(); |
| 112 | OrigTerminator->eraseFromParent(); |
| 113 | } |
| 114 | |
Tobias Grosser | c80d697 | 2016-09-02 06:33:33 +0000 | [diff] [blame] | 115 | /// Generate LLVM-IR for the SCoP @p S. |
Johannes Doerfert | 909a3bf | 2015-03-01 18:42:08 +0000 | [diff] [blame] | 116 | bool runOnScop(Scop &S) override { |
Johannes Doerfert | 3826224 | 2014-09-10 14:50:23 +0000 | [diff] [blame] | 117 | AI = &getAnalysis<IslAstInfo>(); |
Johannes Doerfert | 7ceb040 | 2015-02-11 17:25:09 +0000 | [diff] [blame] | 118 | |
| 119 | // Check if we created an isl_ast root node, otherwise exit. |
| 120 | isl_ast_node *AstRoot = AI->getAst(); |
| 121 | if (!AstRoot) |
| 122 | return false; |
| 123 | |
| 124 | LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); |
Johannes Doerfert | 3826224 | 2014-09-10 14:50:23 +0000 | [diff] [blame] | 125 | DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree(); |
Tobias Grosser | c5bcf24 | 2015-08-17 10:57:08 +0000 | [diff] [blame] | 126 | SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE(); |
Johannes Doerfert | 3f52e35 | 2016-05-23 12:38:05 +0000 | [diff] [blame] | 127 | DL = &S.getFunction().getParent()->getDataLayout(); |
Michael Kruse | 2237088 | 2015-08-11 14:39:21 +0000 | [diff] [blame] | 128 | RI = &getAnalysis<RegionInfoPass>().getRegionInfo(); |
| 129 | Region *R = &S.getRegion(); |
| 130 | assert(!R->isTopLevelRegion() && "Top level regions are not supported"); |
Tobias Grosser | 0ee50f6 | 2013-04-10 06:55:31 +0000 | [diff] [blame] | 131 | |
Tobias Grosser | d78616f | 2015-10-04 11:19:13 +0000 | [diff] [blame] | 132 | ScopAnnotator Annotator; |
Tobias Grosser | 6325cd2 | 2015-04-27 10:43:10 +0000 | [diff] [blame] | 133 | Annotator.buildAliasScopes(S); |
Johannes Doerfert | ecdf263 | 2014-10-02 15:31:24 +0000 | [diff] [blame] | 134 | |
Michael Kruse | 2237088 | 2015-08-11 14:39:21 +0000 | [diff] [blame] | 135 | simplifyRegion(R, DT, LI, RI); |
| 136 | assert(R->isSimple()); |
Johannes Doerfert | ef74443 | 2016-05-23 12:42:38 +0000 | [diff] [blame] | 137 | BasicBlock *EnteringBB = S.getEnteringBlock(); |
Michael Kruse | 2237088 | 2015-08-11 14:39:21 +0000 | [diff] [blame] | 138 | assert(EnteringBB); |
Johannes Doerfert | 3826224 | 2014-09-10 14:50:23 +0000 | [diff] [blame] | 139 | PollyIRBuilder Builder = createPollyIRBuilder(EnteringBB, Annotator); |
Johannes Doerfert | 9744c4a | 2014-08-12 18:35:54 +0000 | [diff] [blame] | 140 | |
Tobias Grosser | 6794238 | 2015-03-28 09:34:40 +0000 | [diff] [blame] | 141 | // Only build the run-time condition and parameters _after_ having |
| 142 | // introduced the conditional branch. This is important as the conditional |
| 143 | // branch will guard the original scop from new induction variables that |
| 144 | // the SCEVExpander may introduce while code generating the parameters and |
| 145 | // which may introduce scalar dependences that prevent us from correctly |
| 146 | // code generating this scop. |
| 147 | BasicBlock *StartBlock = |
| 148 | executeScopConditionally(S, this, Builder.getTrue()); |
Tobias Grosser | bfb6a96 | 2016-03-23 06:57:51 +0000 | [diff] [blame] | 149 | auto *SplitBlock = StartBlock->getSinglePredecessor(); |
Johannes Doerfert | 09e3697 | 2015-10-07 20:17:36 +0000 | [diff] [blame] | 150 | |
Eli Friedman | acf8006 | 2016-11-02 22:32:23 +0000 | [diff] [blame] | 151 | IslNodeBuilder NodeBuilder(Builder, Annotator, this, *DL, *LI, *SE, *DT, S, |
| 152 | StartBlock); |
| 153 | |
Tobias Grosser | 65371af | 2017-04-03 14:55:37 +0000 | [diff] [blame^] | 154 | if (PerfMonitoring) { |
| 155 | PerfMonitor P(EnteringBB->getParent()->getParent()); |
| 156 | P.initialize(); |
| 157 | P.insertRegionStart(SplitBlock->getTerminator()); |
| 158 | |
| 159 | BasicBlock *MergeBlock = SplitBlock->getTerminator() |
| 160 | ->getSuccessor(0) |
| 161 | ->getUniqueSuccessor() |
| 162 | ->getUniqueSuccessor(); |
| 163 | P.insertRegionEnd(MergeBlock->getTerminator()); |
| 164 | } |
| 165 | |
Johannes Doerfert | 09e3697 | 2015-10-07 20:17:36 +0000 | [diff] [blame] | 166 | // First generate code for the hoisted invariant loads and transitively the |
| 167 | // parameters they reference. Afterwards, for the remaining parameters that |
| 168 | // might reference the hoisted loads. Finally, build the runtime check |
| 169 | // that might reference both hoisted loads as well as parameters. |
Johannes Doerfert | c489850 | 2015-11-07 19:46:04 +0000 | [diff] [blame] | 170 | // If the hoisting fails we have to bail and execute the original code. |
Tobias Grosser | 6794238 | 2015-03-28 09:34:40 +0000 | [diff] [blame] | 171 | Builder.SetInsertPoint(SplitBlock->getTerminator()); |
Johannes Doerfert | c489850 | 2015-11-07 19:46:04 +0000 | [diff] [blame] | 172 | if (!NodeBuilder.preloadInvariantLoads()) { |
Johannes Doerfert | 1dd6e37 | 2015-11-08 16:34:17 +0000 | [diff] [blame] | 173 | |
Tobias Grosser | bfb6a96 | 2016-03-23 06:57:51 +0000 | [diff] [blame] | 174 | // Patch the introduced branch condition to ensure that we always execute |
| 175 | // the original SCoP. |
Johannes Doerfert | c489850 | 2015-11-07 19:46:04 +0000 | [diff] [blame] | 176 | auto *FalseI1 = Builder.getFalse(); |
Johannes Doerfert | 3797707 | 2015-11-08 17:57:41 +0000 | [diff] [blame] | 177 | auto *SplitBBTerm = Builder.GetInsertBlock()->getTerminator(); |
| 178 | SplitBBTerm->setOperand(0, FalseI1); |
Johannes Doerfert | 1dd6e37 | 2015-11-08 16:34:17 +0000 | [diff] [blame] | 179 | |
Tobias Grosser | bfb6a96 | 2016-03-23 06:57:51 +0000 | [diff] [blame] | 180 | // Since the other branch is hence ignored we mark it as unreachable and |
| 181 | // adjust the dominator tree accordingly. |
| 182 | auto *ExitingBlock = StartBlock->getUniqueSuccessor(); |
| 183 | assert(ExitingBlock); |
| 184 | auto *MergeBlock = ExitingBlock->getUniqueSuccessor(); |
| 185 | assert(MergeBlock); |
| 186 | markBlockUnreachable(*StartBlock, Builder); |
| 187 | markBlockUnreachable(*ExitingBlock, Builder); |
Johannes Doerfert | ef74443 | 2016-05-23 12:42:38 +0000 | [diff] [blame] | 188 | auto *ExitingBB = S.getExitingBlock(); |
Tobias Grosser | bfb6a96 | 2016-03-23 06:57:51 +0000 | [diff] [blame] | 189 | assert(ExitingBB); |
| 190 | DT->changeImmediateDominator(MergeBlock, ExitingBB); |
| 191 | DT->eraseNode(ExitingBlock); |
| 192 | |
| 193 | isl_ast_node_free(AstRoot); |
Johannes Doerfert | 1dd6e37 | 2015-11-08 16:34:17 +0000 | [diff] [blame] | 194 | } else { |
Roman Gareev | d7754a1 | 2016-07-30 09:25:51 +0000 | [diff] [blame] | 195 | NodeBuilder.allocateNewArrays(); |
Johannes Doerfert | 1dd6e37 | 2015-11-08 16:34:17 +0000 | [diff] [blame] | 196 | NodeBuilder.addParameters(S.getContext()); |
Tobias Grosser | 0aa2953 | 2016-08-08 15:41:52 +0000 | [diff] [blame] | 197 | Value *RTC = NodeBuilder.createRTC(AI->getRunCondition()); |
Johannes Doerfert | 404a0f8 | 2016-05-12 15:12:43 +0000 | [diff] [blame] | 198 | |
Tobias Grosser | 3717aa5 | 2016-06-11 19:17:15 +0000 | [diff] [blame] | 199 | Builder.GetInsertBlock()->getTerminator()->setOperand(0, RTC); |
| 200 | Builder.SetInsertPoint(&StartBlock->front()); |
| 201 | |
| 202 | NodeBuilder.create(AstRoot); |
Tobias Grosser | 8ed5e59 | 2016-07-25 09:15:57 +0000 | [diff] [blame] | 203 | NodeBuilder.finalize(); |
Johannes Doerfert | 1dd6e37 | 2015-11-08 16:34:17 +0000 | [diff] [blame] | 204 | fixRegionInfo(EnteringBB->getParent(), R->getParent()); |
Johannes Doerfert | c489850 | 2015-11-07 19:46:04 +0000 | [diff] [blame] | 205 | } |
| 206 | |
Johannes Doerfert | 6a6a671 | 2016-06-06 12:13:24 +0000 | [diff] [blame] | 207 | Function *F = EnteringBB->getParent(); |
| 208 | verifyGeneratedFunction(S, *F); |
Johannes Doerfert | a9dc529 | 2016-04-08 18:16:02 +0000 | [diff] [blame] | 209 | for (auto *SubF : NodeBuilder.getParallelSubfunctions()) |
| 210 | verifyGeneratedFunction(S, *SubF); |
Tobias Grosser | 652f780 | 2016-02-14 20:56:49 +0000 | [diff] [blame] | 211 | |
Michael Kruse | 4c86a1d | 2015-11-26 12:36:25 +0000 | [diff] [blame] | 212 | // Mark the function such that we run additional cleanup passes on this |
| 213 | // function (e.g. mem2reg to rediscover phi nodes). |
Michael Kruse | 4c86a1d | 2015-11-26 12:36:25 +0000 | [diff] [blame] | 214 | F->addFnAttr("polly-optimized"); |
| 215 | |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 216 | return true; |
| 217 | } |
| 218 | |
Tobias Grosser | c80d697 | 2016-09-02 06:33:33 +0000 | [diff] [blame] | 219 | /// Register all analyses and transformation required. |
Johannes Doerfert | 909a3bf | 2015-03-01 18:42:08 +0000 | [diff] [blame] | 220 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
Tobias Grosser | 42aff30 | 2014-01-13 22:29:56 +0000 | [diff] [blame] | 221 | AU.addRequired<DominatorTreeWrapperPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 222 | AU.addRequired<IslAstInfo>(); |
Matt Arsenault | 8ca3681 | 2014-07-19 18:40:17 +0000 | [diff] [blame] | 223 | AU.addRequired<RegionInfoPass>(); |
Tobias Grosser | c5bcf24 | 2015-08-17 10:57:08 +0000 | [diff] [blame] | 224 | AU.addRequired<ScalarEvolutionWrapperPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 225 | AU.addRequired<ScopDetection>(); |
Johannes Doerfert | 99191c7 | 2016-05-31 09:41:04 +0000 | [diff] [blame] | 226 | AU.addRequired<ScopInfoRegionPass>(); |
Chandler Carruth | f557987 | 2015-01-17 14:16:56 +0000 | [diff] [blame] | 227 | AU.addRequired<LoopInfoWrapperPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 228 | |
Johannes Doerfert | f6557f9 | 2015-03-04 22:43:40 +0000 | [diff] [blame] | 229 | AU.addPreserved<DependenceInfo>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 230 | |
Chandler Carruth | 66ef16b | 2015-09-09 22:13:56 +0000 | [diff] [blame] | 231 | AU.addPreserved<AAResultsWrapperPass>(); |
| 232 | AU.addPreserved<BasicAAWrapperPass>(); |
Chandler Carruth | f557987 | 2015-01-17 14:16:56 +0000 | [diff] [blame] | 233 | AU.addPreserved<LoopInfoWrapperPass>(); |
Tobias Grosser | 42aff30 | 2014-01-13 22:29:56 +0000 | [diff] [blame] | 234 | AU.addPreserved<DominatorTreeWrapperPass>(); |
Chandler Carruth | 66ef16b | 2015-09-09 22:13:56 +0000 | [diff] [blame] | 235 | AU.addPreserved<GlobalsAAWrapperPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 236 | AU.addPreserved<IslAstInfo>(); |
| 237 | AU.addPreserved<ScopDetection>(); |
Tobias Grosser | c5bcf24 | 2015-08-17 10:57:08 +0000 | [diff] [blame] | 238 | AU.addPreserved<ScalarEvolutionWrapperPass>(); |
Chandler Carruth | 66ef16b | 2015-09-09 22:13:56 +0000 | [diff] [blame] | 239 | AU.addPreserved<SCEVAAWrapperPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 240 | |
| 241 | // FIXME: We do not yet add regions for the newly generated code to the |
| 242 | // region tree. |
Matt Arsenault | 8ca3681 | 2014-07-19 18:40:17 +0000 | [diff] [blame] | 243 | AU.addPreserved<RegionInfoPass>(); |
Johannes Doerfert | 99191c7 | 2016-05-31 09:41:04 +0000 | [diff] [blame] | 244 | AU.addPreserved<ScopInfoRegionPass>(); |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 245 | } |
| 246 | }; |
Tobias Grosser | 522478d | 2016-06-23 22:17:27 +0000 | [diff] [blame] | 247 | } // namespace |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 248 | |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 249 | char CodeGeneration::ID = 1; |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 250 | |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 251 | Pass *polly::createCodeGenerationPass() { return new CodeGeneration(); } |
Tobias Grosser | 8a5bc6e | 2012-10-02 19:50:43 +0000 | [diff] [blame] | 252 | |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 253 | INITIALIZE_PASS_BEGIN(CodeGeneration, "polly-codegen", |
Tobias Grosser | 7242ad9 | 2013-02-22 08:07:06 +0000 | [diff] [blame] | 254 | "Polly - Create LLVM-IR from SCoPs", false, false); |
Johannes Doerfert | f6557f9 | 2015-03-04 22:43:40 +0000 | [diff] [blame] | 255 | INITIALIZE_PASS_DEPENDENCY(DependenceInfo); |
Tobias Grosser | 42aff30 | 2014-01-13 22:29:56 +0000 | [diff] [blame] | 256 | INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass); |
Chandler Carruth | f557987 | 2015-01-17 14:16:56 +0000 | [diff] [blame] | 257 | INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); |
Matt Arsenault | 8ca3681 | 2014-07-19 18:40:17 +0000 | [diff] [blame] | 258 | INITIALIZE_PASS_DEPENDENCY(RegionInfoPass); |
Tobias Grosser | c5bcf24 | 2015-08-17 10:57:08 +0000 | [diff] [blame] | 259 | INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass); |
Tobias Grosser | 7242ad9 | 2013-02-22 08:07:06 +0000 | [diff] [blame] | 260 | INITIALIZE_PASS_DEPENDENCY(ScopDetection); |
Tobias Grosser | 09d3069 | 2015-05-12 07:45:52 +0000 | [diff] [blame] | 261 | INITIALIZE_PASS_END(CodeGeneration, "polly-codegen", |
Tobias Grosser | 7242ad9 | 2013-02-22 08:07:06 +0000 | [diff] [blame] | 262 | "Polly - Create LLVM-IR from SCoPs", false, false) |