[IndVarSimplify] Widen loop unsigned compares.
authorChad Rosier <mcrosier@codeaurora.org>
Tue, 30 Sep 2014 03:17:42 +0000 (03:17 +0000)
committerChad Rosier <mcrosier@codeaurora.org>
Tue, 30 Sep 2014 03:17:42 +0000 (03:17 +0000)
This patch extends r217953 to handle unsigned comparison.
Phabricator revision: http://reviews.llvm.org/D5526

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218659 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/IndVarSimplify.cpp
test/Transforms/IndVarSimplify/widen-loop-comp.ll

index 68a134ebfd8f11a8589580978ccbb34584e2ae86..2959c7bd3c7866eaec427667511fad094723a45f 100644 (file)
@@ -936,12 +936,8 @@ bool WidenIV::WidenLoopCompare(NarrowIVDefUse DU) {
   if (!Cmp)
     return false;
 
-  // Must be a signed compare.
-  if (!CmpInst::isSigned(Cmp->getPredicate()))
-    return false;
-
-  // Must be a signed IV user.
-  if (!IsSigned)
+  // Sign of IV user and compare must match.
+  if (IsSigned != CmpInst::isSigned(Cmp->getPredicate()))
     return false;
 
   Value *Op = Cmp->getOperand(Cmp->getOperand(0) == DU.NarrowDef ? 1 : 0);
index b85fc6d1e4cb6bcf7fc6381941f0e780ee42cfb0..bfe74afe8940fd0f26e2eee28dc6e885bc95f3db 100644 (file)
@@ -162,3 +162,31 @@ for.body:
 for.end:
   ret i32 0
 }
+
+; CHECK-LABEL: @test5
+; CHECK: zext i32 %b
+; CHECK: for.cond:
+; CHECK: phi i64
+; CHECK: icmp ule i64
+
+define i32 @test5(i32* %a, i32 %b) {
+entry:
+  br label %for.cond
+
+for.cond:
+  %sum.0 = phi i32 [ 0, %entry ], [ %add, %for.body ]
+  %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+  %cmp = icmp ule i32 %i.0, %b
+  br i1 %cmp, label %for.body, label %for.end
+
+for.body:
+  %idxprom = zext i32 %i.0 to i64
+  %arrayidx = getelementptr inbounds i32* %a, i64 %idxprom
+  %0 = load i32* %arrayidx, align 4
+  %add = add nsw i32 %sum.0, %0
+  %inc = add nsw i32 %i.0, 1
+  br label %for.cond
+
+for.end:
+  ret i32 %sum.0
+}