1448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman//===- ScalarEvolutionNormalization.cpp - See below -------------*- C++ -*-===// 2448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// 3448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// The LLVM Compiler Infrastructure 4448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// 5448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// This file is distributed under the University of Illinois Open Source 6448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// License. See LICENSE.TXT for details. 7448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// 8448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman//===----------------------------------------------------------------------===// 9448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// 10448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// This file implements utilities for working with "normalized" expressions. 11448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// See the comments at the top of ScalarEvolutionNormalization.h for details. 12448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman// 13448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman//===----------------------------------------------------------------------===// 14448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 15448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman#include "llvm/Analysis/Dominators.h" 16448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman#include "llvm/Analysis/LoopInfo.h" 17448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman#include "llvm/Analysis/ScalarEvolutionExpressions.h" 18448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman#include "llvm/Analysis/ScalarEvolutionNormalization.h" 19448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohmanusing namespace llvm; 20448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 21448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// IVUseShouldUsePostIncValue - We have discovered a "User" of an IV expression 22448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// and now we need to decide whether the user should use the preinc or post-inc 23448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// value. If this user should use the post-inc version of the IV, return true. 24448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// 25448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// Choosing wrong here can break dominance properties (if we choose to use the 26448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// post-inc value when we cannot) or it can end up adding extra live-ranges to 27448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// the loop, resulting in reg-reg copies (if we use the pre-inc value when we 28448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman/// should use the post-inc value). 29b7391fadfff3a3d2a0883fac3f7ba09def086b94Dan Gohmanstatic bool IVUseShouldUsePostIncValue(Instruction *User, Value *Operand, 30448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman const Loop *L, DominatorTree *DT) { 31448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // If the user is in the loop, use the preinc value. 32448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (L->contains(User)) return false; 33448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 34448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman BasicBlock *LatchBlock = L->getLoopLatch(); 35448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (!LatchBlock) 36448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return false; 37448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 38448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // Ok, the user is outside of the loop. If it is dominated by the latch 39448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // block, use the post-inc value. 40448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (DT->dominates(LatchBlock, User->getParent())) 41448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return true; 42448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 43448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // There is one case we have to be careful of: PHI nodes. These little guys 44448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // can live in blocks that are not dominated by the latch block, but (since 45448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // their uses occur in the predecessor block, not the block the PHI lives in) 46448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // should still use the post-inc value. Check for this case now. 47448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman PHINode *PN = dyn_cast<PHINode>(User); 48fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman if (!PN || !Operand) return false; // not a phi, not dominated by latch block. 49448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 50b7391fadfff3a3d2a0883fac3f7ba09def086b94Dan Gohman // Look at all of the uses of Operand by the PHI node. If any use corresponds 51b7391fadfff3a3d2a0883fac3f7ba09def086b94Dan Gohman // to a block that is not dominated by the latch block, give up and use the 52448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // preincremented value. 53448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) 54b7391fadfff3a3d2a0883fac3f7ba09def086b94Dan Gohman if (PN->getIncomingValue(i) == Operand && 55fb272ad614e923bebdf226ff9d3fbce5e2ae1192Dan Gohman !DT->dominates(LatchBlock, PN->getIncomingBlock(i))) 56fb272ad614e923bebdf226ff9d3fbce5e2ae1192Dan Gohman return false; 57448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 58b7391fadfff3a3d2a0883fac3f7ba09def086b94Dan Gohman // Okay, all uses of Operand by PN are in predecessor blocks that really are 59448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman // dominated by the latch block. Use the post-incremented value. 60448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return true; 61448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman} 62448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman 6394f01db27bd96021cd69e82d8096e121bc672efeAndrew Tricknamespace { 6494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 6594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// Hold the state used during post-inc expression transformation, including a 6694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// map of transformed expressions. 6794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickclass PostIncTransform { 6894f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick TransformKind Kind; 6994f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick PostIncLoopSet &Loops; 7094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick ScalarEvolution &SE; 7194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick DominatorTree &DT; 7294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 7394f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick DenseMap<const SCEV*, const SCEV*> Transformed; 7494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 7594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickpublic: 7694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick PostIncTransform(TransformKind kind, PostIncLoopSet &loops, 7794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick ScalarEvolution &se, DominatorTree &dt): 7894f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Kind(kind), Loops(loops), SE(se), DT(dt) {} 7994f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 8094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *TransformSubExpr(const SCEV *S, Instruction *User, 8194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Value *OperandValToReplace); 8294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 8394f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickprotected: 8494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *TransformImpl(const SCEV *S, Instruction *User, 8594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Value *OperandValToReplace); 8694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick}; 8794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 8894f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick} // namespace 8994f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 9094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// Implement post-inc transformation for all valid expression types. 9194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickconst SCEV *PostIncTransform:: 9294f01db27bd96021cd69e82d8096e121bc672efeAndrew TrickTransformImpl(const SCEV *S, Instruction *User, Value *OperandValToReplace) { 93082d6b653694185d4049c3823eecc2a98c3aef58Dan Gohman 94448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (const SCEVCastExpr *X = dyn_cast<SCEVCastExpr>(S)) { 95448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman const SCEV *O = X->getOperand(); 9694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *N = TransformSubExpr(O, User, OperandValToReplace); 97448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (O != N) 98448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman switch (S->getSCEVType()) { 99448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scZeroExtend: return SE.getZeroExtendExpr(N, S->getType()); 100448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scSignExtend: return SE.getSignExtendExpr(N, S->getType()); 101448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scTruncate: return SE.getTruncateExpr(N, S->getType()); 102448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman default: llvm_unreachable("Unexpected SCEVCastExpr kind!"); 103448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 104448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return S; 105448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 106082d6b653694185d4049c3823eecc2a98c3aef58Dan Gohman 107fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) { 108fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman // An addrec. This is the interesting part. 109fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman SmallVector<const SCEV *, 8> Operands; 110fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman const Loop *L = AR->getLoop(); 111fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman // The addrec conceptually uses its operands at loop entry. 112fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman Instruction *LUser = L->getHeader()->begin(); 113fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman // Transform each operand. 114fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman for (SCEVNAryExpr::op_iterator I = AR->op_begin(), E = AR->op_end(); 115fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman I != E; ++I) { 11694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Operands.push_back(TransformSubExpr(*I, LUser, 0)); 117fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman } 1183228cc259b5ca00e46af36da369a451f5736cbf4Andrew Trick // Conservatively use AnyWrap until/unless we need FlagNW. 1193228cc259b5ca00e46af36da369a451f5736cbf4Andrew Trick const SCEV *Result = SE.getAddRecExpr(Operands, L, SCEV::FlagAnyWrap); 120fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman switch (Kind) { 121fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman case NormalizeAutodetect: 122fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman if (IVUseShouldUsePostIncValue(User, OperandValToReplace, L, &DT)) { 123fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman const SCEV *TransformedStep = 12494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick TransformSubExpr(AR->getStepRecurrence(SE), 12594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick User, OperandValToReplace); 126fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman Result = SE.getMinusSCEV(Result, TransformedStep); 127fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman Loops.insert(L); 128fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman } 12946ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman#if 0 13046ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman // This assert is conceptually correct, but ScalarEvolution currently 13146ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman // sometimes fails to canonicalize two equal SCEVs to exactly the same 13246ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman // form. It's possibly a pessimization when this happens, but it isn't a 13346ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman // correctness problem, so disable this assert for now. 13494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick assert(S == TransformSubExpr(Result, User, OperandValToReplace) && 135fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman "SCEV normalization is not invertible!"); 136fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman#endif 137fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman break; 138fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman case Normalize: 139fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman if (Loops.count(L)) { 140fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman const SCEV *TransformedStep = 14194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick TransformSubExpr(AR->getStepRecurrence(SE), 14294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick User, OperandValToReplace); 143fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman Result = SE.getMinusSCEV(Result, TransformedStep); 144fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman } 14546ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman#if 0 14646ffb231c6c46f093e0485415f01a1a99f31c8beDan Gohman // See the comment on the assert above. 14794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick assert(S == TransformSubExpr(Result, User, OperandValToReplace) && 148fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman "SCEV normalization is not invertible!"); 149fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman#endif 150fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman break; 151fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman case Denormalize: 152fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman if (Loops.count(L)) 153fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman Result = cast<SCEVAddRecExpr>(Result)->getPostIncExpr(SE); 154fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman break; 155fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman } 156fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman return Result; 157fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman } 158fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman 159448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (const SCEVNAryExpr *X = dyn_cast<SCEVNAryExpr>(S)) { 160448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman SmallVector<const SCEV *, 8> Operands; 161448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman bool Changed = false; 162082d6b653694185d4049c3823eecc2a98c3aef58Dan Gohman // Transform each operand. 163448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman for (SCEVNAryExpr::op_iterator I = X->op_begin(), E = X->op_end(); 164448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman I != E; ++I) { 165448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman const SCEV *O = *I; 16694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *N = TransformSubExpr(O, User, OperandValToReplace); 167448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman Changed |= N != O; 168448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman Operands.push_back(N); 169448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 170fc3678a34625e1c97b4a07d710e2905fb0baaaceDan Gohman // If any operand actually changed, return a transformed result. 171448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (Changed) 172448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman switch (S->getSCEVType()) { 173448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scAddExpr: return SE.getAddExpr(Operands); 174448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scMulExpr: return SE.getMulExpr(Operands); 175448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scSMaxExpr: return SE.getSMaxExpr(Operands); 176448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman case scUMaxExpr: return SE.getUMaxExpr(Operands); 177448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman default: llvm_unreachable("Unexpected SCEVNAryExpr kind!"); 178448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 179448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return S; 180448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 181082d6b653694185d4049c3823eecc2a98c3aef58Dan Gohman 182448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (const SCEVUDivExpr *X = dyn_cast<SCEVUDivExpr>(S)) { 183448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman const SCEV *LO = X->getLHS(); 184448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman const SCEV *RO = X->getRHS(); 18594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *LN = TransformSubExpr(LO, User, OperandValToReplace); 18694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *RN = TransformSubExpr(RO, User, OperandValToReplace); 187448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman if (LO != LN || RO != RN) 188448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return SE.getUDivExpr(LN, RN); 189448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman return S; 190448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman } 191082d6b653694185d4049c3823eecc2a98c3aef58Dan Gohman 192448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman llvm_unreachable("Unexpected SCEV kind!"); 193448db1cdef5872713ef77beffacf502ae3450cd7Dan Gohman} 19494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 19594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// Manage recursive transformation across an expression DAG. Revisiting 19694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// expressions would lead to exponential recursion. 19794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickconst SCEV *PostIncTransform:: 19894f01db27bd96021cd69e82d8096e121bc672efeAndrew TrickTransformSubExpr(const SCEV *S, Instruction *User, Value *OperandValToReplace) { 19994f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 20094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick if (isa<SCEVConstant>(S) || isa<SCEVUnknown>(S)) 20194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick return S; 20294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 2037f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick const SCEV *Result = Transformed.lookup(S); 2047f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick if (Result) 2057f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick return Result; 20694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 2077f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick Result = TransformImpl(S, User, OperandValToReplace); 2087f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick Transformed[S] = Result; 2097f1653a7aee0c30adfa948ad5bdbf12c7cc1e519Andrew Trick return Result; 21094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick} 21194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick 21294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// Top level driver for transforming an expression DAG into its requested 21394f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick/// post-inc form (either "Normalized" or "Denormalized". 21494f01db27bd96021cd69e82d8096e121bc672efeAndrew Trickconst SCEV *llvm::TransformForPostIncUse(TransformKind Kind, 21594f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick const SCEV *S, 21694f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Instruction *User, 21794f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick Value *OperandValToReplace, 21894f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick PostIncLoopSet &Loops, 21994f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick ScalarEvolution &SE, 22094f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick DominatorTree &DT) { 22194f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick PostIncTransform Transform(Kind, Loops, SE, DT); 22294f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick return Transform.TransformSubExpr(S, User, OperandValToReplace); 22394f01db27bd96021cd69e82d8096e121bc672efeAndrew Trick} 224