diff options
author | Sebastian Pop <spop@codeaurora.org> | 2013-02-15 20:55:36 +0000 |
---|---|---|
committer | Sebastian Pop <spop@codeaurora.org> | 2013-02-15 20:55:36 +0000 |
commit | 5661fcdde295645e5c6f982a25225e682727b5b1 (patch) | |
tree | 713cc9e95536e408f6412a67be348fdad6d3e08a /include/llvm/Analysis/ScalarEvolutionExpressions.h | |
parent | a9e4d3f37590bb326e6c5a3ea02ee1aa3db681ea (diff) | |
download | external_llvm-5661fcdde295645e5c6f982a25225e682727b5b1.zip external_llvm-5661fcdde295645e5c6f982a25225e682727b5b1.tar.gz external_llvm-5661fcdde295645e5c6f982a25225e682727b5b1.tar.bz2 |
add ScevApplyRewriter
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175294 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis/ScalarEvolutionExpressions.h')
-rw-r--r-- | include/llvm/Analysis/ScalarEvolutionExpressions.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/include/llvm/Analysis/ScalarEvolutionExpressions.h b/include/llvm/Analysis/ScalarEvolutionExpressions.h index bd15ae1..6a179ca 100644 --- a/include/llvm/Analysis/ScalarEvolutionExpressions.h +++ b/include/llvm/Analysis/ScalarEvolutionExpressions.h @@ -652,6 +652,45 @@ namespace llvm { ValueToValueMap ⤅ }; + typedef DenseMap<const Loop*, const SCEV*> 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<const SCEV *, 2> 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 |