[PATCH] D43499: [SCEV] Introduce SCEVPostIncRewriter

Serguei Katkov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 19 22:36:33 PST 2018


skatkov created this revision.
skatkov added reviewers: sanjoy, mkazantsev, reames.

The patch introduces the SCEVPostIncRewriter rewriter which
is similar to SCEVInitRewriter but rewrites AddRec with post increment
value of this AddRec.

This is a preparation for re-writing isKnownPredicate utility as
described in https://reviews.llvm.org/D42417.


https://reviews.llvm.org/D43499

Files:
  lib/Analysis/ScalarEvolution.cpp


Index: lib/Analysis/ScalarEvolution.cpp
===================================================================
--- lib/Analysis/ScalarEvolution.cpp
+++ lib/Analysis/ScalarEvolution.cpp
@@ -4127,6 +4127,47 @@
   bool Valid = true;
 };
 
+/// Takes SCEV S and Loop L. For each AddRec sub-expression, use its post
+/// increment expression in case its Loop is L. If it is not L then
+/// if IgnoreOtherLoops is true then use AddRec itself
+/// otherwise rewrite cannot be done.
+/// If SCEV contains non-invariant unknown SCEV rewrite cannot be done.
+class SCEVPostIncRewriter : public SCEVRewriteVisitor<SCEVPostIncRewriter> {
+public:
+  static const SCEV *rewrite(const SCEV *S, const Loop *L, ScalarEvolution &SE,
+                             bool IgnoreOtherLoops = false) {
+    SCEVPostIncRewriter Rewriter(L, SE, IgnoreOtherLoops);
+    const SCEV *Result = Rewriter.visit(S);
+    return Rewriter.isValid() ? Result : SE.getCouldNotCompute();
+  }
+
+  const SCEV *visitUnknown(const SCEVUnknown *Expr) {
+    if (!SE.isLoopInvariant(Expr, L))
+      Valid = false;
+    return Expr;
+  }
+
+  const SCEV *visitAddRecExpr(const SCEVAddRecExpr *Expr) {
+    // Only allow AddRecExprs for this loop.
+    if (Expr->getLoop() == L)
+      return Expr->getPostIncExpr(SE);
+    // If we should not ignore other loops then invalidate result.
+    Valid = Valid && IgnoreOtherLoops;
+    return Expr;
+  }
+
+  bool isValid() { return Valid; }
+
+private:
+  explicit SCEVPostIncRewriter(const Loop *L, ScalarEvolution &SE,
+                               bool IgnoreOtherLoops)
+      : SCEVRewriteVisitor(SE), L(L), IgnoreOtherLoops(IgnoreOtherLoops) {}
+
+  const Loop *L;
+  const bool IgnoreOtherLoops;
+  bool Valid = true;
+};
+
 /// This class evaluates the compare condition by matching it against the
 /// condition of loop latch. If there is a match we assume a true value
 /// for the condition while building SCEV nodes.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43499.135008.patch
Type: text/x-patch
Size: 1933 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180220/14c0dc58/attachment.bin>


More information about the llvm-commits mailing list