[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