@@ -5,7 +5,7 @@ define i8 @add_and_sgt(i8 %x) {
5
5
; CHECK-LABEL: define i8 @add_and_sgt(
6
6
; CHECK-SAME: i8 [[X:%.*]]) {
7
7
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
8
- ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16
8
+ ; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 16
9
9
; CHECK-NEXT: ret i8 [[S]]
10
10
;
11
11
%add = add nsw i8 %x , 16
@@ -155,7 +155,7 @@ define i8 @multi_use_cond_and_sel(i8 %x) {
155
155
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X]], 8
156
156
; CHECK-NEXT: call void @use(i1 [[CMP]])
157
157
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smax.i8(i8 [[X]], i8 8)
158
- ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 16
158
+ ; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 16
159
159
; CHECK-NEXT: call void @use_byte(i8 [[S]])
160
160
; CHECK-NEXT: ret i8 [[S]]
161
161
;
@@ -450,3 +450,82 @@ define i8 @umax_sgt(i8 %x) {
450
450
%s = select i1 %cmp , i8 100 , i8 %umax
451
451
ret i8 %s
452
452
}
453
+
454
+ define i8 @add_sgt_nuw_nsw_safe (i8 %x ) {
455
+ ; CHECK-LABEL: define i8 @add_sgt_nuw_nsw_safe(
456
+ ; CHECK-SAME: i8 [[X:%.*]]) {
457
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)
458
+ ; CHECK-NEXT: [[S:%.*]] = add nuw nsw i8 [[TMP1]], 1
459
+ ; CHECK-NEXT: ret i8 [[S]]
460
+ ;
461
+ %add = add nuw nsw i8 %x , 1
462
+ %cmp = icmp sgt i8 %x , 100
463
+ %s = select i1 %cmp , i8 101 , i8 %add
464
+ ret i8 %s
465
+ }
466
+
467
+ define i8 @add_sgt_nuw_only (i8 %x ) {
468
+ ; CHECK-LABEL: define i8 @add_sgt_nuw_only(
469
+ ; CHECK-SAME: i8 [[X:%.*]]) {
470
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)
471
+ ; CHECK-NEXT: [[S:%.*]] = add nuw i8 [[TMP1]], 50
472
+ ; CHECK-NEXT: ret i8 [[S]]
473
+ ;
474
+ %add = add nuw nsw i8 %x , 50
475
+ %cmp = icmp sgt i8 %x , 100
476
+ %s = select i1 %cmp , i8 150 , i8 %add
477
+ ret i8 %s
478
+ }
479
+
480
+ define i8 @add_sgt_nsw_only (i8 %x ) {
481
+ ; CHECK-LABEL: define i8 @add_sgt_nsw_only(
482
+ ; CHECK-SAME: i8 [[X:%.*]]) {
483
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.smin.i8(i8 [[X]], i8 100)
484
+ ; CHECK-NEXT: [[S:%.*]] = add nsw i8 [[TMP1]], -99
485
+ ; CHECK-NEXT: ret i8 [[S]]
486
+ ;
487
+ %add = add nuw nsw i8 %x , -99
488
+ %cmp = icmp sgt i8 %x , 100
489
+ %s = select i1 %cmp , i8 1 , i8 %add
490
+ ret i8 %s
491
+ }
492
+
493
+
494
+ define i8 @mul_ult_nuw_nsw_safe (i8 %x ) {
495
+ ; CHECK-LABEL: define i8 @mul_ult_nuw_nsw_safe(
496
+ ; CHECK-SAME: i8 [[X:%.*]]) {
497
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 10)
498
+ ; CHECK-NEXT: [[S:%.*]] = mul nuw nsw i8 [[TMP1]], 3
499
+ ; CHECK-NEXT: ret i8 [[S]]
500
+ ;
501
+ %mul = mul nuw nsw i8 %x , 3
502
+ %cmp = icmp ult i8 %x , 10
503
+ %s = select i1 %cmp , i8 30 , i8 %mul
504
+ ret i8 %s
505
+ }
506
+
507
+ define i8 @mul_ult_nuw_only (i8 %x ) {
508
+ ; CHECK-LABEL: define i8 @mul_ult_nuw_only(
509
+ ; CHECK-SAME: i8 [[X:%.*]]) {
510
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 10)
511
+ ; CHECK-NEXT: [[S:%.*]] = mul nuw i8 [[TMP1]], 25
512
+ ; CHECK-NEXT: ret i8 [[S]]
513
+ ;
514
+ %mul = mul nuw nsw i8 %x , 25
515
+ %cmp = icmp ult i8 %x , 10
516
+ %s = select i1 %cmp , i8 250 , i8 %mul
517
+ ret i8 %s
518
+ }
519
+
520
+ define i8 @mul_ult_nsw_only (i8 %x ) {
521
+ ; CHECK-LABEL: define i8 @mul_ult_nsw_only(
522
+ ; CHECK-SAME: i8 [[X:%.*]]) {
523
+ ; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.umax.i8(i8 [[X]], i8 40)
524
+ ; CHECK-NEXT: [[S:%.*]] = mul nsw i8 [[TMP1]], -2
525
+ ; CHECK-NEXT: ret i8 [[S]]
526
+ ;
527
+ %mul = mul nuw nsw i8 %x , -2
528
+ %cmp = icmp ult i8 %x , 40
529
+ %s = select i1 %cmp , i8 -80 , i8 %mul
530
+ ret i8 %s
531
+ }
0 commit comments