48 if (!PN || !Operand)
return false;
67 class PostIncTransform {
78 Kind(kind),
Loops(loops), SE(se), DT(dt) {}
81 Value *OperandValToReplace);
85 Value *OperandValToReplace);
91 const SCEV *PostIncTransform::
95 const SCEV *O =
X->getOperand();
96 const SCEV *
N = TransformSubExpr(O, User, OperandValToReplace);
110 const Loop *L = AR->getLoop();
116 Operands.
push_back(TransformSubExpr(*
I, LUser, 0));
132 if (AR->isAffine() &&
134 Result = SE.getMinusSCEV(Result, AR->getStepRecurrence(SE));
142 assert(S == TransformSubExpr(Result, User, OperandValToReplace) &&
143 "SCEV normalization is not invertible!");
147 if (
Loops.count(L)) {
148 const SCEV *TransformedStep =
149 TransformSubExpr(AR->getStepRecurrence(SE),
150 User, OperandValToReplace);
151 Result = SE.getMinusSCEV(Result, TransformedStep);
155 assert(S == TransformSubExpr(Result, User, OperandValToReplace) &&
156 "SCEV normalization is not invertible!");
161 Result = cast<SCEVAddRecExpr>(Result)->getPostIncExpr(SE);
169 bool Changed =
false;
174 const SCEV *N = TransformSubExpr(O, User, OperandValToReplace);
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);
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);
205 const SCEV *PostIncTransform::
208 if (isa<SCEVConstant>(S) || isa<SCEVUnknown>(S))
211 const SCEV *Result = Transformed.lookup(S);
215 Result = TransformImpl(S, User, OperandValToReplace);
216 Transformed[S] = Result;
225 Value *OperandValToReplace,
229 PostIncTransform Transform(Kind, Loops, SE, DT);
230 return Transform.TransformSubExpr(S, User, OperandValToReplace);
void push_back(const T &Elt)
const SCEV * TransformForPostIncUse(TransformKind Kind, const SCEV *S, Instruction *User, Value *OperandValToReplace, PostIncLoopSet &Loops, ScalarEvolution &SE, DominatorTree &DT)
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
BlockT * getHeader() const
BlockT * getLoopLatch() const
#define llvm_unreachable(msg)
const SCEV *const * op_iterator
unsigned getNumIncomingValues() const
LLVM Basic Block Representation.
Normalize - Normalize according to the given loops.
BasicBlock * getIncomingBlock(unsigned i) const
bool contains(const LoopT *L) const
bool dominates(const DomTreeNode *A, const DomTreeNode *B) const
Value * getIncomingValue(unsigned i) const
static bool IVUseShouldUsePostIncValue(Instruction *User, Value *Operand, const Loop *L, DominatorTree *DT)
unsigned getSCEVType() const
LLVM Value Representation.
static RegisterPass< NVPTXAllocaHoisting > X("alloca-hoisting","Hoisting alloca instructions in non-entry ""blocks to the entry block")
const BasicBlock * getParent() const