]> granicus.if.org Git - llvm/commitdiff
[ValueTracking] Fix recurrence detection to check both PHI operands.
authorFlorian Hahn <flo@fhahn.com>
Fri, 16 Aug 2019 09:15:02 +0000 (09:15 +0000)
committerFlorian Hahn <flo@fhahn.com>
Fri, 16 Aug 2019 09:15:02 +0000 (09:15 +0000)
Summary:
Currently we fail to compute known bits for recurrences where the
first incoming value is the start value of the recurrence.

Instead of exiting the loop when the first incoming value is not
the step of the recurrence, continue to check the second incoming
value.

The original code uses a loop to handle both cases, but incorrectly
exits instead of continuing.

Reviewers: lebedev.ri, spatel, nikic

Reviewed By: lebedev.ri

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D66216

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

lib/Analysis/ValueTracking.cpp
test/Transforms/InstCombine/phi-known-bits-operand-order.ll

index 8027c2706ee45918d79f7d1181486b33fea5bbbd..127c3dcc35c8b9e2b29d541b25d304af55ff3ae0 100644 (file)
@@ -1373,7 +1373,7 @@ static void computeKnownBitsFromOperator(const Operator *I, KnownBits &Known,
           else if (LR == I)
             L = LL;
           else
-            break;
+            continue; // Check for recurrence with L and R flipped.
           // Ok, we have a PHI of the form L op= R. Check for low
           // zero bits.
           computeKnownBits(R, Known2, Depth + 1, Q);
index 3ab2dc8e312934b93a7f0a64a09a01a299293624..e21e388e7dc2c75e6150fd0521f7d17af5032641 100644 (file)
@@ -19,8 +19,8 @@ define void @phi_recurrence_start_first() {
 ; CHECK-NEXT:    br i1 [[COND_V]], label [[FOR_COND11:%.*]], label [[FOR_COND26]]
 ; CHECK:       for.cond11:
 ; CHECK-NEXT:    [[I_1:%.*]] = phi i32 [ [[START]], [[IF_THEN]] ], [ [[STEP:%.*]], [[FOR_COND11]] ]
-; CHECK-NEXT:    [[CMP13:%.*]] = icmp slt i32 [[I_1]], 100
-; CHECK-NEXT:    [[STEP]] = add nsw i32 [[I_1]], 1
+; CHECK-NEXT:    [[CMP13:%.*]] = icmp ult i32 [[I_1]], 100
+; CHECK-NEXT:    [[STEP]] = add nuw nsw i32 [[I_1]], 1
 ; CHECK-NEXT:    br i1 [[CMP13]], label [[FOR_COND11]], label [[WHILE_END]]
 ; CHECK:       for.cond26:
 ; CHECK-NEXT:    br label [[WHILE_COND]]