DianQK 462eb7e28e
[ValueTracking] Skip incoming values that are the same as the phi in isGuaranteedNotToBeUndefOrPoison (#130111)
Fixes (keep it open) #130110.

If the incoming value is PHI itself, we can skip this. If we can
guarantee that the other incoming values are neither undef nor poison,
then we can also guarantee that the value isn't either. If we cannot
guarantee that, it makes no sense in calculating it.
2025-03-07 05:46:32 +08:00

90 lines
2.3 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -passes=instsimplify < %s | FileCheck %s
; Test `%r` can be replaced by `%nonpoison`.
define i32 @other_noundef(i32 noundef %arg) {
; CHECK-LABEL: define i32 @other_noundef(
; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
; CHECK-NEXT: [[START:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[NONPOISON:%.*]] = phi i32 [ 0, %[[START]] ], [ [[NONPOISON]], %[[BB0:.*]] ], [ [[ARG]], %[[BB1:.*]] ]
; CHECK-NEXT: [[I:%.*]] = call i32 @opaque()
; CHECK-NEXT: switch i32 [[I]], label %[[EXIT:.*]] [
; CHECK-NEXT: i32 0, label %[[BB0]]
; CHECK-NEXT: i32 1, label %[[BB1]]
; CHECK-NEXT: ]
; CHECK: [[EXIT]]:
; CHECK-NEXT: ret i32 [[NONPOISON]]
; CHECK: [[BB0]]:
; CHECK-NEXT: br label %[[LOOP]]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[LOOP]]
;
start:
br label %loop
loop:
%nonpoison = phi i32 [ 0, %start ], [ %nonpoison, %bb0 ], [ %arg, %bb1 ]
%i = call i32 @opaque()
switch i32 %i, label %exit [
i32 0, label %bb0
i32 1, label %bb1
]
exit:
%r = freeze i32 %nonpoison
ret i32 %r
bb0:
br label %loop
bb1:
br label %loop
}
define i32 @other_poison(i32 %arg) {
; CHECK-LABEL: define i32 @other_poison(
; CHECK-SAME: i32 [[ARG:%.*]]) {
; CHECK-NEXT: [[START:.*]]:
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[MAYPOISON:%.*]] = phi i32 [ 0, %[[START]] ], [ [[MAYPOISON]], %[[BB0:.*]] ], [ [[ARG]], %[[BB1:.*]] ]
; CHECK-NEXT: [[I:%.*]] = call i32 @opaque()
; CHECK-NEXT: switch i32 [[I]], label %[[EXIT:.*]] [
; CHECK-NEXT: i32 0, label %[[BB0]]
; CHECK-NEXT: i32 1, label %[[BB1]]
; CHECK-NEXT: ]
; CHECK: [[EXIT]]:
; CHECK-NEXT: [[R:%.*]] = freeze i32 [[MAYPOISON]]
; CHECK-NEXT: ret i32 [[R]]
; CHECK: [[BB0]]:
; CHECK-NEXT: br label %[[LOOP]]
; CHECK: [[BB1]]:
; CHECK-NEXT: br label %[[LOOP]]
;
start:
br label %loop
loop:
%maypoison = phi i32 [ 0, %start ], [ %maypoison, %bb0 ], [ %arg, %bb1 ]
%i = call i32 @opaque()
switch i32 %i, label %exit [
i32 0, label %bb0
i32 1, label %bb1
]
exit:
%r = freeze i32 %maypoison
ret i32 %r
bb0:
br label %loop
bb1:
br label %loop
}
declare i32 @opaque()