summaryrefslogtreecommitdiffstats
path: root/polly/lib/Analysis/ScopInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/Analysis/ScopInfo.cpp')
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp83
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) {
OpenPOWER on IntegriCloud