X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAnalysis%2FScalarEvolutionExpressions.h;h=eac91131ad535c53ec2fcaf42199c313abfc6ea6;hb=b075ed3b90fa2a520aeb15802fddf3460d865f91;hp=bd15ae12c85bf4b997bb69bec64bda710340d6e8;hpb=a9e4d3f37590bb326e6c5a3ea02ee1aa3db681ea;p=oota-llvm.git diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h index bd15ae12c85..eac91131ad5 100644 --- a/include/llvm/Analysis/ScalarEvolutionExpressions.h +++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h @@ -549,12 +549,14 @@ namespace llvm { T.visitAll(Root); } - /// The ScevRewriter takes a scalar evolution expression and copies all its + /// The SCEVRewriter takes a scalar evolution expression and copies all its /// components. The result after a rewrite is an identical SCEV. - struct ScevRewriter - : public SCEVVisitor { + struct SCEVRewriter + : public SCEVVisitor { public: - ScevRewriter(ScalarEvolution &S) : SE(S) {} + SCEVRewriter(ScalarEvolution &S) : SE(S) {} + + virtual ~SCEVRewriter() {} virtual const SCEV *visitConstant(const SCEVConstant *Constant) { return Constant; @@ -629,17 +631,17 @@ namespace llvm { typedef DenseMap ValueToValueMap; - /// The ScevParameterRewriter takes a scalar evolution expression and updates + /// The SCEVParameterRewriter takes a scalar evolution expression and updates /// the SCEVUnknown components following the Map (Value -> Value). - struct ScevParameterRewriter: public ScevRewriter { + struct SCEVParameterRewriter: public SCEVRewriter { public: static const SCEV *rewrite(const SCEV *Scev, ScalarEvolution &SE, ValueToValueMap &Map) { - ScevParameterRewriter Rewriter(SE, Map); + SCEVParameterRewriter Rewriter(SE, Map); return Rewriter.visit(Scev); } - ScevParameterRewriter(ScalarEvolution &S, ValueToValueMap &M) - : ScevRewriter(S), Map(M) {} + SCEVParameterRewriter(ScalarEvolution &S, ValueToValueMap &M) + : SCEVRewriter(S), Map(M) {} virtual const SCEV *visitUnknown(const SCEVUnknown *Expr) { Value *V = Expr->getValue(); @@ -652,6 +654,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