[PATCH] D33420: [LIR] Strenghen the check for recurrence variable in popcnt/CTLZ

Davide Italiano via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 22 14:35:31 PDT 2017


davide created this revision.
Herald added a subscriber: mzolotukhin.

Fixes PR33114 (see https://bugs.llvm.org/show_bug.cgi?id=33114 for discussion).


https://reviews.llvm.org/D33420

Files:
  lib/Transforms/Scalar/LoopIdiomRecognize.cpp
  test/Transforms/LoopIdiom/pr33114.ll


Index: test/Transforms/LoopIdiom/pr33114.ll
===================================================================
--- /dev/null
+++ test/Transforms/LoopIdiom/pr33114.ll
@@ -0,0 +1,34 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -loop-idiom %s | FileCheck %s
+
+define void @tinkywinky() {
+; CHECK-LABEL: @tinkywinky(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br i1 true, label [[EXIT:%.*]], label [[PH:%.*]]
+; CHECK:       ph:
+; CHECK-NEXT:    [[MYPHI:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ]
+; CHECK-NEXT:    br label [[IF_END:%.*]]
+; CHECK:       if.end:
+; CHECK-NEXT:    [[PATATINO:%.*]] = ashr i32 [[MYPHI]], undef
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[PATATINO]], 0
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[EXIT_LOOPEXIT:%.*]], label [[IF_END]]
+; CHECK:       exit.loopexit:
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br i1 true, label %exit, label %ph
+
+ph:
+  %myphi = phi i32 [ 1, %entry ]
+  br label %if.end
+
+if.end:
+  %patatino = ashr i32 %myphi, undef
+  %tobool = icmp eq i32 %patatino, 0
+  br i1 %tobool, label %exit, label %if.end
+
+exit:
+  ret void
+}
Index: lib/Transforms/Scalar/LoopIdiomRecognize.cpp
===================================================================
--- lib/Transforms/Scalar/LoopIdiomRecognize.cpp
+++ lib/Transforms/Scalar/LoopIdiomRecognize.cpp
@@ -1035,6 +1035,16 @@
   return nullptr;
 }
 
+// Check if the recurrence variable `VarX` is in the right form to form
+// the idiom. Returns true if so, and PhiX will contain the value coerced
+// to a PHINode.
+static bool checkRecurrence(Value *&VarX, Instruction *&DefX,
+                            BasicBlock *LoopEntry, PHINode *&PhiX) {
+  PhiX = dyn_cast<PHINode>(VarX);
+  return PhiX && PhiX->getParent() == LoopEntry &&
+         (PhiX->getOperand(0) == DefX || PhiX->getOperand(1) == DefX);
+}
+
 /// Return true iff the idiom is detected in the loop.
 ///
 /// Additionally:
@@ -1110,13 +1120,8 @@
   }
 
   // step 3: Check the recurrence of variable X
-  {
-    PhiX = dyn_cast<PHINode>(VarX1);
-    if (!PhiX ||
-        (PhiX->getOperand(0) != DefX2 && PhiX->getOperand(1) != DefX2)) {
-      return false;
-    }
-  }
+  if (!checkRecurrence(VarX1, DefX2, LoopEntry, PhiX))
+    return false;
 
   // step 4: Find the instruction which count the population: cnt2 = cnt1 + 1
   {
@@ -1227,8 +1232,7 @@
   VarX = DefX->getOperand(0);
 
   // step 3: Check the recurrence of variable X
-  PhiX = dyn_cast<PHINode>(VarX);
-  if (!PhiX || (PhiX->getOperand(0) != DefX && PhiX->getOperand(1) != DefX))
+  if (!checkRecurrence(VarX, DefX, LoopEntry, PhiX))
     return false;
 
   // step 4: Find the instruction which count the CTLZ: cnt.next = cnt + 1


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D33420.99816.patch
Type: text/x-patch
Size: 2778 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170522/016d7204/attachment.bin>


More information about the llvm-commits mailing list