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,87 +12,149 @@ 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
- ; CHECK-NEXT: ret i1 true
19
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], [[ARG]]
20
+ ; CHECK-NEXT: ret i1 [[CMP]]
20
21
;
21
22
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
22
23
%cmp = icmp sge i32 %abs , %arg
23
24
ret i1 %cmp
24
25
}
25
26
26
- define i1 @abs_plus_one (i32 %arg ) {
27
- ; CHECK-LABEL: define i1 @abs_plus_one (
28
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
29
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true )
27
+ define i1 @abs_plus_one_min_is_not_poison (i32 noundef %arg ) {
28
+ ; CHECK-LABEL: define i1 @abs_plus_one_min_is_not_poison (
29
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
30
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false )
30
31
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
31
32
; CHECK-NEXT: ret i1 true
32
33
;
33
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
34
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
34
35
%abs_plus_one = add nsw i32 %abs , 1
35
36
%cmp = icmp sge i32 %abs_plus_one , %arg
36
37
ret i1 %cmp
37
38
}
38
39
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:%.*]]) {
40
+ define i1 @abs_plus_one_min_is_poison (i32 noundef %arg ) {
41
+ ; CHECK-LABEL: define i1 @abs_plus_one_min_is_poison (
42
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
42
43
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
44
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
45
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS_PLUS_ONE]], [[ARG]]
46
+ ; CHECK-NEXT: ret i1 [[CMP]]
47
+ ;
48
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
49
+ %abs_plus_one = add nsw i32 %abs , 1
50
+ %cmp = icmp sge i32 %abs_plus_one , %arg
51
+ ret i1 %cmp
52
+ }
53
+
54
+ define i1 @arg_minus_one_strict_less_min_is_not_poison (i32 noundef %arg ) {
55
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_less_min_is_not_poison(
56
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
57
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
43
58
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
44
59
; CHECK-NEXT: ret i1 true
45
60
;
46
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
61
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
47
62
%arg_minus_one = add nsw i32 %arg , -1
48
63
%cmp = icmp slt i32 %arg_minus_one , %abs
49
64
ret i1 %cmp
50
65
}
51
66
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:%.*]]) {
67
+
68
+ define i1 @arg_minus_one_strict_less_min_is_poison (i32 noundef %arg ) {
69
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_less_min_is_poison(
70
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
55
71
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
56
72
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
73
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[ARG_MINUS_ONE]], [[ABS]]
74
+ ; CHECK-NEXT: ret i1 [[CMP]]
75
+ ;
76
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
77
+ %arg_minus_one = add nsw i32 %arg , -1
78
+ %cmp = icmp slt i32 %arg_minus_one , %abs
79
+ ret i1 %cmp
80
+ }
81
+
82
+ define i1 @arg_minus_one_strict_greater_min_is_not_poison (i32 noundef %arg ) {
83
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_greater_min_is_not_poison(
84
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
85
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
86
+ ; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
57
87
; CHECK-NEXT: ret i1 false
88
+ ;
89
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
90
+ %arg_minus_one = add nsw i32 %arg , -1
91
+ %cmp = icmp sgt i32 %arg_minus_one , %abs
92
+ ret i1 %cmp
93
+ }
94
+
95
+ define i1 @arg_minus_one_strict_greater_min_is_poison (i32 noundef %arg ) {
96
+ ; CHECK-LABEL: define i1 @arg_minus_one_strict_greater_min_is_poison(
97
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
98
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
99
+ ; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
100
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ARG_MINUS_ONE]], [[ABS]]
101
+ ; CHECK-NEXT: ret i1 [[CMP]]
58
102
;
59
103
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
60
104
%arg_minus_one = add nsw i32 %arg , -1
61
105
%cmp = icmp sgt i32 %arg_minus_one , %abs
62
106
ret i1 %cmp
63
107
}
64
108
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:%.*]]) {
109
+ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_not_poison (i32 noundef %arg ) {
110
+ ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_not_poison (
111
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
68
112
; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
69
113
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
70
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true )
114
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false )
71
115
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
72
116
; CHECK-NEXT: ret i1 true
73
117
;
74
118
%cmp_arg_nonnegative = icmp sge i32 %arg , 0
75
119
call void @llvm.assume (i1 %cmp_arg_nonnegative )
76
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
120
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
77
121
%abs_plus_one = add nuw i32 %abs , 1
78
122
%cmp = icmp uge i32 %abs_plus_one , %arg
79
123
ret i1 %cmp
80
124
}
81
125
82
- define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified (i32 %arg ) {
83
- ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(
84
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
126
+ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_poison (i32 noundef %arg ) {
127
+ ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_poison(
128
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
129
+ ; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
130
+ ; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
85
131
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
86
132
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
87
133
; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[ABS_PLUS_ONE]], [[ARG]]
88
134
; CHECK-NEXT: ret i1 [[CMP]]
89
135
;
136
+ %cmp_arg_nonnegative = icmp sge i32 %arg , 0
137
+ call void @llvm.assume (i1 %cmp_arg_nonnegative )
90
138
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
91
139
%abs_plus_one = add nuw i32 %abs , 1
92
140
%cmp = icmp uge i32 %abs_plus_one , %arg
93
141
ret i1 %cmp
94
142
}
95
143
144
+ define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified (i32 noundef %arg ) {
145
+ ; CHECK-LABEL: define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(
146
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
147
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
148
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
149
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp uge i32 [[ABS_PLUS_ONE]], [[ARG]]
150
+ ; CHECK-NEXT: ret i1 [[CMP]]
151
+ ;
152
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
153
+ %abs_plus_one = add nuw i32 %abs , 1
154
+ %cmp = icmp uge i32 %abs_plus_one , %arg
155
+ ret i1 %cmp
156
+ }
157
+
96
158
define i1 @abs_constant_negative_arg () {
97
159
; CHECK-LABEL: define i1 @abs_constant_negative_arg() {
98
160
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 false)
@@ -114,9 +176,9 @@ define i1 @abs_constant_positive_arg() {
114
176
ret i1 %cmp
115
177
}
116
178
117
- define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison (i32 %arg ) {
179
+ define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison (i32 noundef %arg ) {
118
180
; CHECK-LABEL: define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(
119
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
181
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
120
182
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
121
183
; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
122
184
; CHECK-NEXT: ret i1 [[CMP]]
@@ -126,23 +188,36 @@ define i1 @abs_is_nonnegative_except_for_int_min_if_int_min_is_not_poison(i32 %a
126
188
ret i1 %cmp
127
189
}
128
190
129
- define i1 @abs_is_not_strictly_positive (i32 %arg ) {
191
+ define i1 @abs_is_not_strictly_positive (i32 noundef %arg ) {
130
192
; 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 )
193
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
194
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false )
133
195
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ABS]], 0
134
196
; CHECK-NEXT: ret i1 [[CMP]]
135
197
;
136
- %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
198
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
137
199
%cmp = icmp sgt i32 %abs , 0
138
200
ret i1 %cmp
139
201
}
140
202
141
- define i1 @abs_is_nonnegative_int_min_is_poison (i32 %arg ) {
203
+ define i1 @abs_is_nonnegative_int_min_is_not_poison (i32 noundef %arg ) {
204
+ ; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_not_poison(
205
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
206
+ ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 false)
207
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
208
+ ; CHECK-NEXT: ret i1 [[CMP]]
209
+ ;
210
+ %abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 false )
211
+ %cmp = icmp sge i32 %abs , 0
212
+ ret i1 %cmp
213
+ }
214
+
215
+ define i1 @abs_is_nonnegative_int_min_is_poison (i32 noundef %arg ) {
142
216
; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_poison(
143
- ; CHECK-SAME: i32 [[ARG:%.*]]) {
217
+ ; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
144
218
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
145
- ; CHECK-NEXT: ret i1 true
219
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
220
+ ; CHECK-NEXT: ret i1 [[CMP]]
146
221
;
147
222
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
148
223
%cmp = icmp sge i32 %abs , 0
@@ -152,7 +227,8 @@ define i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
152
227
define i1 @abs_is_nonnegative_constant_arg () {
153
228
; CHECK-LABEL: define i1 @abs_is_nonnegative_constant_arg() {
154
229
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
155
- ; CHECK-NEXT: ret i1 true
230
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
231
+ ; CHECK-NEXT: ret i1 [[CMP]]
156
232
;
157
233
%abs = tail call i32 @llvm.abs.i32 (i32 -3 , i1 true )
158
234
%cmp = icmp sge i32 %abs , 0
0 commit comments