@@ -16,7 +16,8 @@ define i1 @abs_int_min_is_poison(i32 %arg) {
16
16
; CHECK-LABEL: define i1 @abs_int_min_is_poison(
17
17
; CHECK-SAME: i32 [[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
@@ -41,7 +42,8 @@ define i1 @abs_plus_one_min_is_poison(i32 %arg) {
41
42
; CHECK-SAME: i32 [[ARG:%.*]]) {
42
43
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
43
44
; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nsw i32 [[ABS]], 1
44
- ; CHECK-NEXT: ret i1 true
45
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS_PLUS_ONE]], [[ARG]]
46
+ ; CHECK-NEXT: ret i1 [[CMP]]
45
47
;
46
48
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
47
49
%abs_plus_one = add nsw i32 %abs , 1
@@ -68,7 +70,8 @@ define i1 @arg_minus_one_strict_less_min_is_poison(i32 %arg) {
68
70
; CHECK-SAME: i32 [[ARG:%.*]]) {
69
71
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
70
72
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
71
- ; CHECK-NEXT: ret i1 true
73
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[ARG_MINUS_ONE]], [[ABS]]
74
+ ; CHECK-NEXT: ret i1 [[CMP]]
72
75
;
73
76
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
74
77
%arg_minus_one = add nsw i32 %arg , -1
@@ -94,7 +97,8 @@ define i1 @arg_minus_one_strict_greater_min_is_poison(i32 %arg) {
94
97
; CHECK-SAME: i32 [[ARG:%.*]]) {
95
98
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
96
99
; CHECK-NEXT: [[ARG_MINUS_ONE:%.*]] = add nsw i32 [[ARG]], -1
97
- ; CHECK-NEXT: ret i1 false
100
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[ARG_MINUS_ONE]], [[ABS]]
101
+ ; CHECK-NEXT: ret i1 [[CMP]]
98
102
;
99
103
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
100
104
%arg_minus_one = add nsw i32 %arg , -1
@@ -107,8 +111,7 @@ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_not_poi
107
111
; CHECK-SAME: i32 noundef [[ARG:%.*]]) {
108
112
; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
109
113
; 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
114
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ARG]], 1
112
115
; CHECK-NEXT: ret i1 true
113
116
;
114
117
%cmp_arg_nonnegative = icmp sge i32 %arg , 0
@@ -124,8 +127,7 @@ define i1 @abs_plus_one_unsigned_greater_or_equal_nonnegative_arg_min_is_poison(
124
127
; CHECK-SAME: i32 [[ARG:%.*]]) {
125
128
; CHECK-NEXT: [[CMP_ARG_NONNEGATIVE:%.*]] = icmp sge i32 [[ARG]], 0
126
129
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_ARG_NONNEGATIVE]])
127
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
128
- ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ABS]], 1
130
+ ; CHECK-NEXT: [[ABS_PLUS_ONE:%.*]] = add nuw i32 [[ARG]], 1
129
131
; CHECK-NEXT: ret i1 true
130
132
;
131
133
%cmp_arg_nonnegative = icmp sge i32 %arg , 0
@@ -152,9 +154,7 @@ define i1 @abs_plus_one_unsigned_greater_or_equal_cannot_be_simplified(i32 nound
152
154
153
155
define i1 @abs_constant_negative_arg () {
154
156
; CHECK-LABEL: define i1 @abs_constant_negative_arg() {
155
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 false)
156
- ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 3
157
- ; CHECK-NEXT: ret i1 [[CMP]]
157
+ ; CHECK-NEXT: ret i1 true
158
158
;
159
159
%abs = tail call i32 @llvm.abs.i32 (i32 -3 , i1 false )
160
160
%cmp = icmp sge i32 %abs , 3
@@ -163,7 +163,6 @@ define i1 @abs_constant_negative_arg() {
163
163
164
164
define i1 @abs_constant_positive_arg () {
165
165
; CHECK-LABEL: define i1 @abs_constant_positive_arg() {
166
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 3, i1 false)
167
166
; CHECK-NEXT: ret i1 true
168
167
;
169
168
%abs = tail call i32 @llvm.abs.i32 (i32 3 , i1 false )
@@ -211,7 +210,8 @@ define i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
211
210
; CHECK-LABEL: define i1 @abs_is_nonnegative_int_min_is_poison(
212
211
; CHECK-SAME: i32 [[ARG:%.*]]) {
213
212
; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 [[ARG]], i1 true)
214
- ; CHECK-NEXT: ret i1 true
213
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[ABS]], 0
214
+ ; CHECK-NEXT: ret i1 [[CMP]]
215
215
;
216
216
%abs = tail call i32 @llvm.abs.i32 (i32 %arg , i1 true )
217
217
%cmp = icmp sge i32 %abs , 0
@@ -220,7 +220,6 @@ define i1 @abs_is_nonnegative_int_min_is_poison(i32 %arg) {
220
220
221
221
define i1 @abs_is_nonnegative_constant_arg () {
222
222
; CHECK-LABEL: define i1 @abs_is_nonnegative_constant_arg() {
223
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i32 @llvm.abs.i32(i32 -3, i1 true)
224
223
; CHECK-NEXT: ret i1 true
225
224
;
226
225
%abs = tail call i32 @llvm.abs.i32 (i32 -3 , i1 true )
@@ -233,8 +232,7 @@ define i64 @abs_assume_nonnegative(i64 noundef %arg) {
233
232
; CHECK-SAME: i64 noundef [[ARG:%.*]]) {
234
233
; CHECK-NEXT: [[PRECOND:%.*]] = icmp sge i64 [[ARG]], 0
235
234
; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]])
236
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i64 @llvm.abs.i64(i64 [[ARG]], i1 false)
237
- ; CHECK-NEXT: ret i64 [[ABS]]
235
+ ; CHECK-NEXT: ret i64 [[ARG]]
238
236
;
239
237
%precond = icmp sge i64 %arg , 0
240
238
call void @llvm.assume (i1 %precond )
@@ -247,7 +245,7 @@ define i64 @abs_assume_negative(i64 noundef %arg) {
247
245
; CHECK-SAME: i64 noundef [[ARG:%.*]]) {
248
246
; CHECK-NEXT: [[PRECOND:%.*]] = icmp slt i64 [[ARG]], 0
249
247
; CHECK-NEXT: call void @llvm.assume(i1 [[PRECOND]])
250
- ; CHECK-NEXT: [[ABS:%.*]] = tail call i64 @llvm.abs.i64(i64 [[ARG]], i1 false)
248
+ ; CHECK-NEXT: [[ABS:%.*]] = sub i64 0, [[ARG]]
251
249
; CHECK-NEXT: ret i64 [[ABS]]
252
250
;
253
251
%precond = icmp slt i64 %arg , 0
0 commit comments