
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.
90 lines
2.3 KiB
LLVM
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()
|