Mercurial > hg > CbC > CbC_llvm
comparison lib/Analysis/ScalarEvolutionNormalization.cpp @ 0:95c75e76d11b LLVM3.4
LLVM 3.4
author | Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 12 Dec 2013 13:56:28 +0900 |
parents | |
children | 54457678186b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:95c75e76d11b |
---|---|
1 //===- ScalarEvolutionNormalization.cpp - See below -------------*- C++ -*-===// | |
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 // | |
10 // This file implements utilities for working with "normalized" expressions. | |
11 // See the comments at the top of ScalarEvolutionNormalization.h for details. | |
12 // | |
13 //===----------------------------------------------------------------------===// | |
14 | |
15 #include "llvm/Analysis/Dominators.h" | |
16 #include "llvm/Analysis/LoopInfo.h" | |
17 #include "llvm/Analysis/ScalarEvolutionExpressions.h" | |
18 #include "llvm/Analysis/ScalarEvolutionNormalization.h" | |
19 using namespace llvm; | |
20 | |
21 /// IVUseShouldUsePostIncValue - We have discovered a "User" of an IV expression | |
22 /// and now we need to decide whether the user should use the preinc or post-inc | |
23 /// value. If this user should use the post-inc version of the IV, return true. | |
24 /// | |
25 /// Choosing wrong here can break dominance properties (if we choose to use the | |
26 /// post-inc value when we cannot) or it can end up adding extra live-ranges to | |
27 /// the loop, resulting in reg-reg copies (if we use the pre-inc value when we | |
28 /// should use the post-inc value). | |
29 static bool IVUseShouldUsePostIncValue(Instruction *User, Value *Operand, | |
30 const Loop *L, DominatorTree *DT) { | |
31 // If the user is in the loop, use the preinc value. | |
32 if (L->contains(User)) return false; | |
33 | |
34 BasicBlock *LatchBlock = L->getLoopLatch(); | |
35 if (!LatchBlock) | |
36 return false; | |
37 | |
38 // Ok, the user is outside of the loop. If it is dominated by the latch | |
39 // block, use the post-inc value. | |
40 if (DT->dominates(LatchBlock, User->getParent())) | |
41 return true; | |
42 | |
43 // There is one case we have to be careful of: PHI nodes. These little guys | |
44 // can live in blocks that are not dominated by the latch block, but (since | |
45 // their uses occur in the predecessor block, not the block the PHI lives in) | |
46 // should still use the post-inc value. Check for this case now. | |
47 PHINode *PN = dyn_cast<PHINode>(User); | |
48 if (!PN || !Operand) return false; // not a phi, not dominated by latch block. | |
49 | |
50 // Look at all of the uses of Operand by the PHI node. If any use corresponds | |
51 // to a block that is not dominated by the latch block, give up and use the | |
52 // preincremented value. | |
53 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) | |
54 if (PN->getIncomingValue(i) == Operand && | |
55 !DT->dominates(LatchBlock, PN->getIncomingBlock(i))) | |
56 return false; | |
57 | |
58 // Okay, all uses of Operand by PN are in predecessor blocks that really are | |
59 // dominated by the latch block. Use the post-incremented value. | |
60 return true; | |
61 } | |
62 | |
63 namespace { | |
64 | |
65 /// Hold the state used during post-inc expression transformation, including a | |
66 /// map of transformed expressions. | |
67 class PostIncTransform { | |
68 TransformKind Kind; | |
69 PostIncLoopSet &Loops; | |
70 ScalarEvolution &SE; | |
71 DominatorTree &DT; | |
72 | |
73 DenseMap<const SCEV*, const SCEV*> Transformed; | |
74 | |
75 public: | |
76 PostIncTransform(TransformKind kind, PostIncLoopSet &loops, | |
77 ScalarEvolution &se, DominatorTree &dt): | |
78 Kind(kind), Loops(loops), SE(se), DT(dt) {} | |
79 | |
80 const SCEV *TransformSubExpr(const SCEV *S, Instruction *User, | |
81 Value *OperandValToReplace); | |
82 | |
83 protected: | |
84 const SCEV *TransformImpl(const SCEV *S, Instruction *User, | |
85 Value *OperandValToReplace); | |
86 }; | |
87 | |
88 } // namespace | |
89 | |
90 /// Implement post-inc transformation for all valid expression types. | |
91 const SCEV *PostIncTransform:: | |
92 TransformImpl(const SCEV *S, Instruction *User, Value *OperandValToReplace) { | |
93 | |
94 if (const SCEVCastExpr *X = dyn_cast<SCEVCastExpr>(S)) { | |
95 const SCEV *O = X->getOperand(); | |
96 const SCEV *N = TransformSubExpr(O, User, OperandValToReplace); | |
97 if (O != N) | |
98 switch (S->getSCEVType()) { | |
99 case scZeroExtend: return SE.getZeroExtendExpr(N, S->getType()); | |
100 case scSignExtend: return SE.getSignExtendExpr(N, S->getType()); | |
101 case scTruncate: return SE.getTruncateExpr(N, S->getType()); | |
102 default: llvm_unreachable("Unexpected SCEVCastExpr kind!"); | |
103 } | |
104 return S; | |
105 } | |
106 | |
107 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) { | |
108 // An addrec. This is the interesting part. | |
109 SmallVector<const SCEV *, 8> Operands; | |
110 const Loop *L = AR->getLoop(); | |
111 // The addrec conceptually uses its operands at loop entry. | |
112 Instruction *LUser = L->getHeader()->begin(); | |
113 // Transform each operand. | |
114 for (SCEVNAryExpr::op_iterator I = AR->op_begin(), E = AR->op_end(); | |
115 I != E; ++I) { | |
116 Operands.push_back(TransformSubExpr(*I, LUser, 0)); | |
117 } | |
118 // Conservatively use AnyWrap until/unless we need FlagNW. | |
119 const SCEV *Result = SE.getAddRecExpr(Operands, L, SCEV::FlagAnyWrap); | |
120 switch (Kind) { | |
121 case NormalizeAutodetect: | |
122 // Normalize this SCEV by subtracting the expression for the final step. | |
123 // We only allow affine AddRecs to be normalized, otherwise we would not | |
124 // be able to correctly denormalize. | |
125 // e.g. {1,+,3,+,2} == {-2,+,1,+,2} + {3,+,2} | |
126 // Normalized form: {-2,+,1,+,2} | |
127 // Denormalized form: {1,+,3,+,2} | |
128 // | |
129 // However, denormalization would use the a different step expression than | |
130 // normalization (see getPostIncExpr), generating the wrong final | |
131 // expression: {-2,+,1,+,2} + {1,+,2} => {-1,+,3,+,2} | |
132 if (AR->isAffine() && | |
133 IVUseShouldUsePostIncValue(User, OperandValToReplace, L, &DT)) { | |
134 Result = SE.getMinusSCEV(Result, AR->getStepRecurrence(SE)); | |
135 Loops.insert(L); | |
136 } | |
137 #if 0 | |
138 // This assert is conceptually correct, but ScalarEvolution currently | |
139 // sometimes fails to canonicalize two equal SCEVs to exactly the same | |
140 // form. It's possibly a pessimization when this happens, but it isn't a | |
141 // correctness problem, so disable this assert for now. | |
142 assert(S == TransformSubExpr(Result, User, OperandValToReplace) && | |
143 "SCEV normalization is not invertible!"); | |
144 #endif | |
145 break; | |
146 case Normalize: | |
147 if (Loops.count(L)) { | |
148 const SCEV *TransformedStep = | |
149 TransformSubExpr(AR->getStepRecurrence(SE), | |
150 User, OperandValToReplace); | |
151 Result = SE.getMinusSCEV(Result, TransformedStep); | |
152 } | |
153 #if 0 | |
154 // See the comment on the assert above. | |
155 assert(S == TransformSubExpr(Result, User, OperandValToReplace) && | |
156 "SCEV normalization is not invertible!"); | |
157 #endif | |
158 break; | |
159 case Denormalize: | |
160 if (Loops.count(L)) | |
161 Result = cast<SCEVAddRecExpr>(Result)->getPostIncExpr(SE); | |
162 break; | |
163 } | |
164 return Result; | |
165 } | |
166 | |
167 if (const SCEVNAryExpr *X = dyn_cast<SCEVNAryExpr>(S)) { | |
168 SmallVector<const SCEV *, 8> Operands; | |
169 bool Changed = false; | |
170 // Transform each operand. | |
171 for (SCEVNAryExpr::op_iterator I = X->op_begin(), E = X->op_end(); | |
172 I != E; ++I) { | |
173 const SCEV *O = *I; | |
174 const SCEV *N = TransformSubExpr(O, User, OperandValToReplace); | |
175 Changed |= N != O; | |
176 Operands.push_back(N); | |
177 } | |
178 // If any operand actually changed, return a transformed result. | |
179 if (Changed) | |
180 switch (S->getSCEVType()) { | |
181 case scAddExpr: return SE.getAddExpr(Operands); | |
182 case scMulExpr: return SE.getMulExpr(Operands); | |
183 case scSMaxExpr: return SE.getSMaxExpr(Operands); | |
184 case scUMaxExpr: return SE.getUMaxExpr(Operands); | |
185 default: llvm_unreachable("Unexpected SCEVNAryExpr kind!"); | |
186 } | |
187 return S; | |
188 } | |
189 | |
190 if (const SCEVUDivExpr *X = dyn_cast<SCEVUDivExpr>(S)) { | |
191 const SCEV *LO = X->getLHS(); | |
192 const SCEV *RO = X->getRHS(); | |
193 const SCEV *LN = TransformSubExpr(LO, User, OperandValToReplace); | |
194 const SCEV *RN = TransformSubExpr(RO, User, OperandValToReplace); | |
195 if (LO != LN || RO != RN) | |
196 return SE.getUDivExpr(LN, RN); | |
197 return S; | |
198 } | |
199 | |
200 llvm_unreachable("Unexpected SCEV kind!"); | |
201 } | |
202 | |
203 /// Manage recursive transformation across an expression DAG. Revisiting | |
204 /// expressions would lead to exponential recursion. | |
205 const SCEV *PostIncTransform:: | |
206 TransformSubExpr(const SCEV *S, Instruction *User, Value *OperandValToReplace) { | |
207 | |
208 if (isa<SCEVConstant>(S) || isa<SCEVUnknown>(S)) | |
209 return S; | |
210 | |
211 const SCEV *Result = Transformed.lookup(S); | |
212 if (Result) | |
213 return Result; | |
214 | |
215 Result = TransformImpl(S, User, OperandValToReplace); | |
216 Transformed[S] = Result; | |
217 return Result; | |
218 } | |
219 | |
220 /// Top level driver for transforming an expression DAG into its requested | |
221 /// post-inc form (either "Normalized" or "Denormalized". | |
222 const SCEV *llvm::TransformForPostIncUse(TransformKind Kind, | |
223 const SCEV *S, | |
224 Instruction *User, | |
225 Value *OperandValToReplace, | |
226 PostIncLoopSet &Loops, | |
227 ScalarEvolution &SE, | |
228 DominatorTree &DT) { | |
229 PostIncTransform Transform(Kind, Loops, SE, DT); | |
230 return Transform.TransformSubExpr(S, User, OperandValToReplace); | |
231 } |