[PATCH] D73181: [SCEV] Do not use backedge SCEV of PHI if its input is another PHI

Denis Antrushin via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 22 06:05:50 PST 2020


dantrushin created this revision.
dantrushin added reviewers: reames, skatkov, sanjoy.google.
Herald added subscribers: javed.absar, hiraditya.
Herald added a project: LLVM.
dantrushin marked an inline comment as done.
dantrushin added inline comments.


================
Comment at: llvm/lib/Analysis/ScalarEvolution.cpp:8247
+            if (!isa<PHINode>(BackedgeVal) &&
+                IsAvailableOnEntry(LI, DT, OnBackedge, PN->getParent()))
               return OnBackedge;
----------------
Bailing out here when any PHI is seen, because I did not find convinient API to get SCEV at previous iteration.
Is there one?


When we have a PHI node depending on another:

  %1 = phi [%A, %entry], [%X, %latch]
  %2 = phi [%B, %entry], [%1, %latch]

it is incorrect to use SCEV of backedge val for PHI %2 as an exit value,
because %2's value if value of %1 at previous iteration.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D73181

Files:
  llvm/lib/Analysis/ScalarEvolution.cpp
  llvm/test/Analysis/ScalarEvolution/pr44605.ll


Index: llvm/test/Analysis/ScalarEvolution/pr44605.ll
===================================================================
--- /dev/null
+++ llvm/test/Analysis/ScalarEvolution/pr44605.ll
@@ -0,0 +1,37 @@
+; RUN: opt < %s -indvars -S | FileCheck %s
+define i32 @test() {
+entry:
+  br label %outer
+
+outer:
+  %local_6_6 = phi i32 [ 10, %entry ], [ %5, %latch ]
+  %local_4_5 = phi i32 [ 56587, %entry ], [ 0, %latch ]
+  %local_3_4 = phi i32 [ 2, %entry ], [ %local_6_6, %latch ]
+  %.udiv = udiv i32 %local_6_6, 8361
+  br label %inner
+
+inner:
+  %local_7_3 = phi i32 [ 2, %outer ], [ %3, %inner ]
+  %local_4_5.pn = phi i32 [ %local_4_5, %outer ], [ %2, %inner ]
+  %local_3_31 = mul i32 %local_4_5.pn, %.udiv
+  %0 = mul i32 %local_7_3, %.udiv
+  %1 = sub i32 %0, %local_3_4
+  %2 = add i32 %1, %local_3_31
+  %3 = add nuw nsw i32 %local_7_3, 1
+  %4 = icmp ugt i32 %local_7_3, 4
+  br i1 %4, label %latch, label %inner
+
+latch:
+  %.lcssa = phi i32 [ %2, %inner ]
+  %5 = add nuw nsw i32 %local_6_6, 1
+  %6 = icmp ugt i32 %local_6_6, 276
+  br i1 %6, label %return, label %outer
+
+; CHECK:     return:
+; CHECK-NOT: ret i32 -277
+return:
+  %.lcssa.lcssa = phi i32 [ %.lcssa, %latch ]
+  ret i32 %.lcssa.lcssa
+
+}
+
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -8241,8 +8241,10 @@
               isKnownPositive(BackedgeTakenCount) &&
               PN->getNumIncomingValues() == 2) {
             unsigned InLoopPred = LI->contains(PN->getIncomingBlock(0)) ? 0 : 1;
-            const SCEV *OnBackedge = getSCEV(PN->getIncomingValue(InLoopPred));
-            if (IsAvailableOnEntry(LI, DT, OnBackedge, PN->getParent()))
+            Value *BackedgeVal = PN->getIncomingValue(InLoopPred);
+            const SCEV *OnBackedge = getSCEV(BackedgeVal);
+            if (!isa<PHINode>(BackedgeVal) &&
+                IsAvailableOnEntry(LI, DT, OnBackedge, PN->getParent()))
               return OnBackedge;
           }
           if (auto *BTCC = dyn_cast<SCEVConstant>(BackedgeTakenCount)) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D73181.239557.patch
Type: text/x-patch
Size: 2156 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200122/85e1b41a/attachment.bin>


More information about the llvm-commits mailing list