diff options
Diffstat (limited to 'polly/lib/Analysis/ScopInfo.cpp')
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 496aadfe72d..3cb53299ed7 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -1421,8 +1421,89 @@ void Scop::setContext(__isl_take isl_set *NewContext) { Context = NewContext; } +/// @brief Remap parameter values but keep AddRecs valid wrt. invariant loads. +struct SCEVSensitiveParameterRewriter + : public SCEVVisitor<SCEVSensitiveParameterRewriter, const SCEV *> { + ValueToValueMap &VMap; + ScalarEvolution &SE; + +public: + SCEVSensitiveParameterRewriter(ValueToValueMap &VMap, ScalarEvolution &SE) + : VMap(VMap), SE(SE) {} + + static const SCEV *rewrite(const SCEV *E, ScalarEvolution &SE, + ValueToValueMap &VMap) { + SCEVSensitiveParameterRewriter SSPR(VMap, SE); + return SSPR.visit(E); + } + + const SCEV *visit(const SCEV *E) { + return SCEVVisitor<SCEVSensitiveParameterRewriter, const SCEV *>::visit(E); + } + + const SCEV *visitConstant(const SCEVConstant *E) { return E; } + + const SCEV *visitTruncateExpr(const SCEVTruncateExpr *E) { + return SE.getTruncateExpr(visit(E->getOperand()), E->getType()); + } + + const SCEV *visitZeroExtendExpr(const SCEVZeroExtendExpr *E) { + return SE.getZeroExtendExpr(visit(E->getOperand()), E->getType()); + } + + const SCEV *visitSignExtendExpr(const SCEVSignExtendExpr *E) { + return SE.getSignExtendExpr(visit(E->getOperand()), E->getType()); + } + + const SCEV *visitAddExpr(const SCEVAddExpr *E) { + SmallVector<const SCEV *, 4> Operands; + for (int i = 0, e = E->getNumOperands(); i < e; ++i) + Operands.push_back(visit(E->getOperand(i))); + return SE.getAddExpr(Operands); + } + + const SCEV *visitMulExpr(const SCEVMulExpr *E) { + SmallVector<const SCEV *, 4> Operands; + for (int i = 0, e = E->getNumOperands(); i < e; ++i) + Operands.push_back(visit(E->getOperand(i))); + return SE.getMulExpr(Operands); + } + + const SCEV *visitSMaxExpr(const SCEVSMaxExpr *E) { + SmallVector<const SCEV *, 4> Operands; + for (int i = 0, e = E->getNumOperands(); i < e; ++i) + Operands.push_back(visit(E->getOperand(i))); + return SE.getSMaxExpr(Operands); + } + + const SCEV *visitUMaxExpr(const SCEVUMaxExpr *E) { + SmallVector<const SCEV *, 4> Operands; + for (int i = 0, e = E->getNumOperands(); i < e; ++i) + Operands.push_back(visit(E->getOperand(i))); + return SE.getUMaxExpr(Operands); + } + + const SCEV *visitUDivExpr(const SCEVUDivExpr *E) { + return SE.getUDivExpr(visit(E->getLHS()), visit(E->getRHS())); + } + + const SCEV *visitAddRecExpr(const SCEVAddRecExpr *E) { + auto *Start = visit(E->getStart()); + auto *AddRec = SE.getAddRecExpr(SE.getConstant(E->getType(), 0), + visit(E->getStepRecurrence(SE)), + E->getLoop(), SCEV::FlagAnyWrap); + return SE.getAddExpr(Start, AddRec); + } + + const SCEV *visitUnknown(const SCEVUnknown *E) { + if (auto *NewValue = VMap.lookup(E->getValue())) + return SE.getUnknown(NewValue); + return E; + } +}; + const SCEV *Scop::getRepresentingInvariantLoadSCEV(const SCEV *S) { - return SCEVParameterRewriter::rewrite(S, *SE, InvEquivClassVMap); + return SCEVSensitiveParameterRewriter::rewrite(S, *SE, InvEquivClassVMap); } void Scop::addParams(std::vector<const SCEV *> NewParameters) { |