From 5661fcdde295645e5c6f982a25225e682727b5b1 Mon Sep 17 00:00:00 2001 From: Sebastian Pop Date: Fri, 15 Feb 2013 20:55:36 +0000 Subject: [PATCH] add ScevApplyRewriter git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175294 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/ScalarEvolutionExpressions.h | 39 ++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h index bd15ae12c85..6a179cae882 100644 --- a/include/llvm/Analysis/ScalarEvolutionExpressions.h +++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h @@ -652,6 +652,45 @@ namespace llvm { ValueToValueMap ⤅ }; + typedef DenseMap LoopToScevMapT; + + /// The ScevApplyRewriter takes a scalar evolution expression and applies + /// the Map (Loop -> SCEV) to all AddRecExprs. + struct ScevApplyRewriter: public ScevRewriter { + public: + static const SCEV *rewrite(const SCEV *Scev, LoopToScevMapT &Map, + ScalarEvolution &SE) { + ScevApplyRewriter Rewriter(SE, Map); + return Rewriter.visit(Scev); + } + ScevApplyRewriter(ScalarEvolution &S, LoopToScevMapT &M) + : ScevRewriter(S), Map(M) {} + + virtual const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) { + SmallVector Operands; + for (int i = 0, e = Expr->getNumOperands(); i < e; ++i) + Operands.push_back(visit(Expr->getOperand(i))); + + const Loop *L = Expr->getLoop(); + const SCEV *Res = SE.getAddRecExpr(Operands, L, Expr->getNoWrapFlags()); + + if (0 == Map.count(L)) + return Res; + + const SCEVAddRecExpr *Rec = (const SCEVAddRecExpr *) Res; + return Rec->evaluateAtIteration(Map[L], SE); + } + + private: + LoopToScevMapT ⤅ + }; + +/// Applies the Map (Loop -> SCEV) to the given Scev. +static inline const SCEV *apply(const SCEV *Scev, LoopToScevMapT &Map, + ScalarEvolution &SE) { + return ScevApplyRewriter::rewrite(Scev, Map, SE); +} + } #endif -- 2.11.0