@@ -264,3 +264,54 @@ define i8 @scmp_from_select_ge(i32 %x, i32 %y) {
264
264
%r = select i1 %ge , i8 %ne , i8 -1
265
265
ret i8 %r
266
266
}
267
+
268
+ ; Fold scmp(x nsw- y, 0) to scmp(x, y)
269
+ define i8 @scmp_of_sub_and_zero (i32 %x , i32 %y ) {
270
+ ; CHECK-LABEL: define i8 @scmp_of_sub_and_zero(
271
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
272
+ ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[X]], i32 [[Y]])
273
+ ; CHECK-NEXT: ret i8 [[R]]
274
+ ;
275
+ %diff = sub nsw i32 %x , %y
276
+ %r = call i8 @llvm.scmp (i32 %diff , i32 0 )
277
+ ret i8 %r
278
+ }
279
+
280
+ ; Negative test: no nsw
281
+ define i8 @scmp_of_sub_and_zero_neg_1 (i32 %x , i32 %y ) {
282
+ ; CHECK-LABEL: define i8 @scmp_of_sub_and_zero_neg_1(
283
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
284
+ ; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[X]], [[Y]]
285
+ ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[DIFF]], i32 0)
286
+ ; CHECK-NEXT: ret i8 [[R]]
287
+ ;
288
+ %diff = sub i32 %x , %y
289
+ %r = call i8 @llvm.scmp (i32 %diff , i32 0 )
290
+ ret i8 %r
291
+ }
292
+
293
+ ; Negative test: second argument of scmp is not 0
294
+ define i8 @scmp_of_sub_and_zero_neg2 (i32 %x , i32 %y ) {
295
+ ; CHECK-LABEL: define i8 @scmp_of_sub_and_zero_neg2(
296
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
297
+ ; CHECK-NEXT: [[DIFF:%.*]] = sub nsw i32 [[X]], [[Y]]
298
+ ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.scmp.i8.i32(i32 [[DIFF]], i32 15)
299
+ ; CHECK-NEXT: ret i8 [[R]]
300
+ ;
301
+ %diff = sub nsw i32 %x , %y
302
+ %r = call i8 @llvm.scmp (i32 %diff , i32 15 )
303
+ ret i8 %r
304
+ }
305
+
306
+ ; Negative test: calling ucmp instead of scmp
307
+ define i8 @scmp_of_sub_and_zero_neg3 (i32 %x , i32 %y ) {
308
+ ; CHECK-LABEL: define i8 @scmp_of_sub_and_zero_neg3(
309
+ ; CHECK-SAME: i32 [[X:%.*]], i32 [[Y:%.*]]) {
310
+ ; CHECK-NEXT: [[DIFF:%.*]] = sub nsw i32 [[X]], [[Y]]
311
+ ; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.ucmp.i8.i32(i32 [[DIFF]], i32 0)
312
+ ; CHECK-NEXT: ret i8 [[R]]
313
+ ;
314
+ %diff = sub nsw i32 %x , %y
315
+ %r = call i8 @llvm.ucmp (i32 %diff , i32 0 )
316
+ ret i8 %r
317
+ }
0 commit comments