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