Skip to content

Commit 62c0f62

Browse files
committed
ValueTracking: fix thinko, crash; add test
1 parent fb1933c commit 62c0f62

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3538,7 +3538,7 @@ static bool isNonEqualPHIs(const PHINode *PN1, const PHINode *PN2,
35383538
const Value *IV1 = PN1->getIncomingValueForBlock(IncomBB);
35393539
const Value *IV2 = PN2->getIncomingValueForBlock(IncomBB);
35403540
const unsigned PhiRecursionLimit =
3541-
std::max(Depth, MaxAnalysisRecursionDepth - 2);
3541+
std::max(Depth + 1, MaxAnalysisRecursionDepth - 2);
35423542
SimplifyQuery RecQ = Q.getWithoutCondContext();
35433543
RecQ.CxtI = IncomBB->getTerminator();
35443544
if (!isKnownNonEqual(IV1, IV2, DemandedElts, PhiRecursionLimit, RecQ))

llvm/test/Analysis/ValueTracking/known-non-equal.ll

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,56 @@ exit:
342342
ret i1 %cmp
343343
}
344344

345+
define i1 @phi_max_recursion_limit(i1 %cond, i32 %switch.cond) {
346+
; CHECK-LABEL: @phi_max_recursion_limit(
347+
; CHECK-NEXT: entry:
348+
; CHECK-NEXT: br label [[BB0:%.*]]
349+
; CHECK: bb0:
350+
; CHECK-NEXT: [[PHIA_0:%.*]] = phi i32 [ [[PHIA_1:%.*]], [[BB1:%.*]] ], [ 0, [[ENTRY:%.*]] ]
351+
; CHECK-NEXT: [[PHIB_0:%.*]] = phi i32 [ [[PHIB_1:%.*]], [[BB1]] ], [ 0, [[ENTRY]] ]
352+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[SWITCH_BLOCK:%.*]], label [[EXIT:%.*]]
353+
; CHECK: switch.block:
354+
; CHECK-NEXT: switch i32 [[SWITCH_COND:%.*]], label [[BB1]] [
355+
; CHECK-NEXT: i32 0, label [[EPILOGUE:%.*]]
356+
; CHECK-NEXT: i32 1, label [[EPILOGUE]]
357+
; CHECK-NEXT: ]
358+
; CHECK: bb1:
359+
; CHECK-NEXT: [[PHIA_1]] = phi i32 [ [[PHIA_0]], [[SWITCH_BLOCK]] ], [ 0, [[EPILOGUE]] ]
360+
; CHECK-NEXT: [[PHIB_1]] = phi i32 [ [[PHIB_0]], [[SWITCH_BLOCK]] ], [ 0, [[EPILOGUE]] ]
361+
; CHECK-NEXT: br label [[BB0]]
362+
; CHECK: epilogue:
363+
; CHECK-NEXT: br label [[BB1]]
364+
; CHECK: exit:
365+
; CHECK-NEXT: [[RET:%.*]] = icmp eq i32 [[PHIA_0]], [[PHIB_0]]
366+
; CHECK-NEXT: ret i1 [[RET]]
367+
;
368+
entry:
369+
br label %bb0
370+
371+
bb0:
372+
%phiA.0 = phi i32 [ %phiA.1, %bb1 ], [ 0, %entry ]
373+
%phiB.0 = phi i32 [ %phiB.1, %bb1 ], [ 0, %entry ]
374+
br i1 %cond, label %switch.block, label %exit
375+
376+
switch.block:
377+
switch i32 %switch.cond, label %bb1 [
378+
i32 0, label %epilogue
379+
i32 1, label %epilogue
380+
]
381+
382+
bb1:
383+
%phiA.1 = phi i32 [ %phiA.0, %switch.block ], [ 0, %epilogue ]
384+
%phiB.1 = phi i32 [ %phiB.0, %switch.block ], [ 0, %epilogue ]
385+
br label %bb0
386+
387+
epilogue:
388+
br label %bb1
389+
390+
exit:
391+
%ret = icmp eq i32 %phiA.0, %phiB.0
392+
ret i1 %ret
393+
}
394+
345395
define i1 @known_non_equal_phis_fail(i8 %p, ptr %pq, i8 %n, i8 %r) {
346396
; CHECK-LABEL: @known_non_equal_phis_fail(
347397
; CHECK-NEXT: entry:

0 commit comments

Comments
 (0)