1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2
2
; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
3
4
- define i1 @abs_int_min_is_not_poison (i32 %arg ) {
4
+ define i1 @abs_int_min_is_not_poison (i32 noundef %arg ) {
5
5
; CHECK-LABEL: define i1 @abs_int_min_is_not_poison(
6
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
6
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
7
7
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
8
8
; CHECK-NEXT: ret i1 true
9
9
;
@@ -12,9 +12,9 @@ define i1 @abs_int_min_is_not_poison(i32 %arg) {
12
12
ret i1 %cmp
13
13
}
14
14
15
- define i1 @abs_int_min_is_poison (i32 %arg ) {
15
+ define i1 @abs_int_min_is_poison (i32 noundef %arg ) {
16
16
; CHECK-LABEL: define i1 @abs_int_min_is_poison(
17
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
17
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
18
18
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
19
19
; CHECK-NEXT: ret i1 true
20
20
;
@@ -23,9 +23,22 @@ define i1 @abs_int_min_is_poison(i32 %arg) {
23
23
ret i1 %cmp
24
24
}
25
25
26
- define i1 @abs_plus_one (i32 %arg ) {
27
- ; CHECK-LABEL: define i1 @abs_plus_one(
28
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
26
+ define i1 @abs_plus_one_min_is_not_poison (i32 noundef %arg ) {
27
+ ; CHECK-LABEL: define i1 @abs_plus_one_min_is_not_poison(
28
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
29
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
30
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
31
+ ; CHECK-NEXT: ret i1 true
32
+ ;
33
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
34
+ %abs_plus_one = add nsw i32 %abs , 1
35
+ %cmp = icmp sge i32 %abs_plus_one , %arg
36
+ ret i1 %cmp
37
+ }
38
+
39
+ define i1 @abs_plus_one_min_is_poison (i32 noundef %arg ) {
40
+ ; CHECK-LABEL: define i1 @abs_plus_one_min_is_poison(
41
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
29
42
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
30
43
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
31
44
; CHECK-NEXT: ret i1 true
@@ -36,9 +49,23 @@ define i1 @abs_plus_one(i32 %arg) {
36
49
ret i1 %cmp
37
50
}
38
51
39
- define i1 @arg_minus_one_strict_less (i32 %arg ) {
40
- ; CHECK-LABEL: define i1 @arg_minus_one_strict_less(
41
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
52
+ define i1 @arg_minus_one_strict_less_min_is_not_poison (i32 noundef %arg ) {
53
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_less_min_is_not_poison(
54
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
55
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
56
+ ; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
57
+ ; CHECK-NEXT: ret i1 true
58
+ ;
59
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
60
+ %arg_minus_one = add nsw i32 %arg , -1
61
+ %cmp = icmp slt i32 %arg_minus_one , %abs
62
+ ret i1 %cmp
63
+ }
64
+
65
+
66
+ define i1 @arg_minus_one_strict_less_min_is_poison (i32 noundef %arg ) {
67
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_less_min_is_poison(
68
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
42
69
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
43
70
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
44
71
; CHECK-NEXT: ret i1 true
@@ -49,9 +76,22 @@ define i1 @arg_minus_one_strict_less(i32 %arg) {
49
76
ret i1 %cmp
50
77
}
51
78
52
- define i1 @arg_minus_one_strict_greater (i32 %arg ) {
53
- ; CHECK-LABEL: define i1 @arg_minus_one_strict_greater(
54
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
79
+ define i1 @arg_minus_one_strict_greater_min_is_not_poison (i32 noundef %arg ) {
80
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_greater_min_is_not_poison(
81
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
82
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
83
+ ; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
84
+ ; CHECK-NEXT: ret i1 false
85
+ ;
86
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
87
+ %arg_minus_one = add nsw i32 %arg , -1
88
+ %cmp = icmp sgt i32 %arg_minus_one , %abs
89
+ ret i1 %cmp
90
+ }
91
+
92
+ define i1 @arg_minus_one_strict_greater_min_is_poison (i32 noundef %arg ) {
93
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_greater_min_is_poison(
94
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
55
95
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
56
96
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
57
97
; CHECK-NEXT: ret i1 false
@@ -62,9 +102,26 @@ define i1 @arg_minus_one_strict_greater(i32 %arg) {
62
102
ret i1 %cmp
63
103
}
64
104
65
- define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg (i32 %arg ) {
66
- ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg(
67
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
105
+ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_not_poison (i32 noundef %arg ) {
106
+ ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_not_poison(
107
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
108
+ ; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
109
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
110
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
111
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
112
+ ; CHECK-NEXT: ret i1 true
113
+ ;
114
+ %cmp_arg_nonnegative = icmp sge i32 %arg , 0
115
+ call void @llvm.assume (i1 %cmp_arg_nonnegative )
116
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
117
+ %abs_plus_one = add nuw i32 %abs , 1
118
+ %cmp = icmp uge i32 %abs_plus_one , %arg
119
+ ret i1 %cmp
120
+ }
121
+
122
+ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_poison (i32 noundef %arg ) {
123
+ ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_poison(
124
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
68
125
; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
69
126
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
70
127
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
@@ -79,15 +136,15 @@ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg(i32 %arg) {
79
136
ret i1 %cmp
80
137
}
81
138
82
- define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified (i32 %arg ) {
139
+ define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified (i32 noundef %arg ) {
83
140
; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(
84
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
85
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true )
141
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
142
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false )
86
143
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
87
144
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[ABS_PLUS_ONE]], [[ARG]]
88
145
; CHECK-NEXT: ret i1 [[CMP]]
89
146
;
90
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
147
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
91
148
%abs_plus_one = add nuw i32 %abs , 1
92
149
%cmp = icmp uge i32 %abs_plus_one , %arg
93
150
ret i1 %cmp
@@ -114,9 +171,9 @@ define i1 @abs_constant_positive_arg() {
114
171
ret i1 %cmp
115
172
}
116
173
117
- define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison (i32 %arg ) {
174
+ define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison (i32 noundef %arg ) {
118
175
; CHECK-LABEL: define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(
119
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
176
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
120
177
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
121
178
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
122
179
; CHECK-NEXT: ret i1 [[CMP]]
@@ -126,21 +183,33 @@ define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(i32 %a
126
183
ret i1 %cmp
127
184
}
128
185
129
- define i1 @abs_is_not_strictly_positive (i32 %arg ) {
186
+ define i1 @abs_is_not_strictly_positive (i32 noundef %arg ) {
130
187
; CHECK-LABEL: define i1 @abs_is_not_strictly_positive(
131
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
132
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true )
188
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
189
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false )
133
190
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ABS]], 0
134
191
; CHECK-NEXT: ret i1 [[CMP]]
135
192
;
136
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
193
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
137
194
%cmp = icmp sgt i32 %abs , 0
138
195
ret i1 %cmp
139
196
}
140
197
141
- define i1 @abs_is_nonnegative_int_min_is_poison (i32 %arg ) {
198
+ define i1 @abs_is_nonnegative_int_min_is_not_poison (i32 noundef %arg ) {
199
+ ; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_not_poison(
200
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
201
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
202
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
203
+ ; CHECK-NEXT: ret i1 [[CMP]]
204
+ ;
205
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
206
+ %cmp = icmp sge i32 %abs , 0
207
+ ret i1 %cmp
208
+ }
209
+
210
+ define i1 @abs_is_nonnegative_int_min_is_poison (i32 noundef %arg ) {
142
211
; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_poison(
143
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
212
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
144
213
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
145
214
; CHECK-NEXT: ret i1 true
146
215
;
0 commit comments