xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/umin-result-may-be-poison.ll (revision 3d91d9613e294b242d853039209b40a0cb7853f2)
1c83180c1SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2c83180c1SFlorian Hahn; RUN: opt -p constraint-elimination -S %s | FileCheck %s
3c83180c1SFlorian Hahn
4c83180c1SFlorian Hahn; Tests for https://github.com/llvm/llvm-project/issues/78621.
5c83180c1SFlorian Hahn
6c83180c1SFlorian Hahndefine i1 @umin_not_used(i32 %arg) {
7c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_not_used(
8c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) {
9*3d91d961SFlorian Hahn; CHECK-NEXT:    [[ICMP:%.*]] = icmp slt i32 [[ARG]], 0
10c83180c1SFlorian Hahn; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3
11c83180c1SFlorian Hahn; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80)
12c83180c1SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3
13*3d91d961SFlorian Hahn; CHECK-NEXT:    ret i1 [[ICMP]]
14c83180c1SFlorian Hahn;
15c83180c1SFlorian Hahn  %icmp = icmp slt i32 %arg, 0
16c83180c1SFlorian Hahn  %shl = shl nuw nsw i32 %arg, 3
17c83180c1SFlorian Hahn  call i32 @llvm.umin.i32(i32 %shl, i32 80)
18c83180c1SFlorian Hahn  %cmp2 = shl nuw nsw i32 %arg, 3
19c83180c1SFlorian Hahn  ret i1 %icmp
20c83180c1SFlorian Hahn}
21c83180c1SFlorian Hahn
22c83180c1SFlorian Hahndefine i1 @umin_poison_is_UB_via_call(i32 %arg) {
23c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_poison_is_UB_via_call(
24c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) {
25c83180c1SFlorian Hahn; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3
26c83180c1SFlorian Hahn; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80)
27c83180c1SFlorian Hahn; CHECK-NEXT:    call void @noundef(i32 noundef [[MIN]])
28c83180c1SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3
29c83180c1SFlorian Hahn; CHECK-NEXT:    ret i1 false
30c83180c1SFlorian Hahn;
31c83180c1SFlorian Hahn  %icmp = icmp slt i32 %arg, 0
32c83180c1SFlorian Hahn  %shl = shl nuw nsw i32 %arg, 3
33c83180c1SFlorian Hahn  %min = call i32 @llvm.umin.i32(i32 %shl, i32 80)
34c83180c1SFlorian Hahn  call void @noundef(i32 noundef %min)
35c83180c1SFlorian Hahn  %cmp2 = shl nuw nsw i32 %arg, 3
36c83180c1SFlorian Hahn  ret i1 %icmp
37c83180c1SFlorian Hahn}
38c83180c1SFlorian Hahn
39c83180c1SFlorian Hahndefine i1 @umin_poison_call_before_UB(i32 %arg) {
40c83180c1SFlorian Hahn; CHECK-LABEL: define i1 @umin_poison_call_before_UB(
41c83180c1SFlorian Hahn; CHECK-SAME: i32 [[ARG:%.*]]) {
42*3d91d961SFlorian Hahn; CHECK-NEXT:    [[ICMP:%.*]] = icmp slt i32 [[ARG]], 0
43c83180c1SFlorian Hahn; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i32 [[ARG]], 3
44c83180c1SFlorian Hahn; CHECK-NEXT:    [[MIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SHL]], i32 80)
45c83180c1SFlorian Hahn; CHECK-NEXT:    call void @fn()
46c83180c1SFlorian Hahn; CHECK-NEXT:    call void @noundef(i32 noundef [[MIN]])
47c83180c1SFlorian Hahn; CHECK-NEXT:    [[CMP2:%.*]] = shl nuw nsw i32 [[ARG]], 3
48*3d91d961SFlorian Hahn; CHECK-NEXT:    ret i1 [[ICMP]]
49c83180c1SFlorian Hahn;
50c83180c1SFlorian Hahn  %icmp = icmp slt i32 %arg, 0
51c83180c1SFlorian Hahn  %shl = shl nuw nsw i32 %arg, 3
52c83180c1SFlorian Hahn  %min = call i32 @llvm.umin.i32(i32 %shl, i32 80)
53c83180c1SFlorian Hahn  call void @fn()
54c83180c1SFlorian Hahn  call void @noundef(i32 noundef %min)
55c83180c1SFlorian Hahn  %cmp2 = shl nuw nsw i32 %arg, 3
56c83180c1SFlorian Hahn  ret i1 %icmp
57c83180c1SFlorian Hahn}
58c83180c1SFlorian Hahn
59c83180c1SFlorian Hahndeclare i32 @llvm.umin.i32(i32, i32) #0
60c83180c1SFlorian Hahn
61c83180c1SFlorian Hahndeclare void @noundef(i32 noundef)
62c83180c1SFlorian Hahndeclare void @fn()
63