3
3
4
4
declare void @use (i32 )
5
5
6
- ; These 18 exercise all combinations of signed comparison
6
+ ; These exercise all combinations of signed comparison
7
7
; for each of the three values produced by your typical
8
8
; 3way compare function (-1, 0, 1)
9
9
@@ -81,8 +81,8 @@ unreached:
81
81
define void @test_low_sle (i64 %a , i64 %b ) {
82
82
; CHECK-LABEL: define void @test_low_sle
83
83
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
84
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i64 [[A]], [[B]]
85
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
84
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp slt i64 [[A]], [[B]]
85
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
86
86
; CHECK: normal:
87
87
; CHECK-NEXT: ret void
88
88
; CHECK: unreached:
@@ -105,8 +105,8 @@ unreached:
105
105
define void @test_low_ne (i64 %a , i64 %b ) {
106
106
; CHECK-LABEL: define void @test_low_ne
107
107
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
108
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i64 [[A]], [[B]]
109
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
108
+ ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp slt i64 [[A]], [[B]]
109
+ ; CHECK-NEXT: br i1 [[CMP_NOT ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
110
110
; CHECK: normal:
111
111
; CHECK-NEXT: ret void
112
112
; CHECK: unreached:
@@ -130,8 +130,8 @@ unreached:
130
130
define void @test_low_eq (i64 %a , i64 %b ) {
131
131
; CHECK-LABEL: define void @test_low_eq
132
132
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
133
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i64 [[A]], [[B]]
134
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
133
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp slt i64 [[A]], [[B]]
134
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
135
135
; CHECK: normal:
136
136
; CHECK-NEXT: ret void
137
137
; CHECK: unreached:
@@ -154,8 +154,8 @@ unreached:
154
154
define void @test_mid_sgt (i64 %a , i64 %b ) {
155
155
; CHECK-LABEL: define void @test_mid_sgt
156
156
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
157
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp sgt i64 [[A]], [[B]]
158
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
157
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp sgt i64 [[A]], [[B]]
158
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
159
159
; CHECK: normal:
160
160
; CHECK-NEXT: ret void
161
161
; CHECK: unreached:
@@ -178,8 +178,8 @@ unreached:
178
178
define void @test_mid_slt (i64 %a , i64 %b ) {
179
179
; CHECK-LABEL: define void @test_mid_slt
180
180
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
181
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp slt i64 [[A]], [[B]]
182
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
181
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp slt i64 [[A]], [[B]]
182
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
183
183
; CHECK: normal:
184
184
; CHECK-NEXT: ret void
185
185
; CHECK: unreached:
@@ -252,8 +252,8 @@ unreached:
252
252
define void @test_mid_ne (i64 %a , i64 %b ) {
253
253
; CHECK-LABEL: define void @test_mid_ne
254
254
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
255
- ; CHECK-NEXT: [[EQ :%.*]] = icmp eq i64 [[A]], [[B]]
256
- ; CHECK-NEXT: br i1 [[EQ ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
255
+ ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp eq i64 [[A]], [[B]]
256
+ ; CHECK-NEXT: br i1 [[CMP_NOT ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
257
257
; CHECK: normal:
258
258
; CHECK-NEXT: ret void
259
259
; CHECK: unreached:
@@ -277,8 +277,8 @@ unreached:
277
277
define void @test_mid_eq (i64 %a , i64 %b ) {
278
278
; CHECK-LABEL: define void @test_mid_eq
279
279
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
280
- ; CHECK-NEXT: [[EQ :%.*]] = icmp eq i64 [[A]], [[B]]
281
- ; CHECK-NEXT: br i1 [[EQ ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
280
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i64 [[A]], [[B]]
281
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
282
282
; CHECK: normal:
283
283
; CHECK-NEXT: ret void
284
284
; CHECK: unreached:
@@ -348,8 +348,8 @@ unreached:
348
348
define void @test_high_sge (i64 %a , i64 %b ) {
349
349
; CHECK-LABEL: define void @test_high_sge
350
350
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
351
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp sgt i64 [[A]], [[B]]
352
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
351
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp sgt i64 [[A]], [[B]]
352
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
353
353
; CHECK: normal:
354
354
; CHECK-NEXT: ret void
355
355
; CHECK: unreached:
@@ -396,8 +396,8 @@ unreached:
396
396
define void @test_high_ne (i64 %a , i64 %b ) {
397
397
; CHECK-LABEL: define void @test_high_ne
398
398
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
399
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp sgt i64 [[A]], [[B]]
400
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
399
+ ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp sgt i64 [[A]], [[B]]
400
+ ; CHECK-NEXT: br i1 [[CMP_NOT ]], label [[NORMAL:%.*]], label [[UNREACHED:%.*]]
401
401
; CHECK: normal:
402
402
; CHECK-NEXT: ret void
403
403
; CHECK: unreached:
@@ -421,8 +421,8 @@ unreached:
421
421
define void @test_high_eq (i64 %a , i64 %b ) {
422
422
; CHECK-LABEL: define void @test_high_eq
423
423
; CHECK-SAME: (i64 [[A:%.*]], i64 [[B:%.*]]) {
424
- ; CHECK-NEXT: [[TMP1 :%.*]] = icmp sgt i64 [[A]], [[B]]
425
- ; CHECK-NEXT: br i1 [[TMP1 ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
424
+ ; CHECK-NEXT: [[CMP :%.*]] = icmp sgt i64 [[A]], [[B]]
425
+ ; CHECK-NEXT: br i1 [[CMP ]], label [[UNREACHED:%.*]], label [[NORMAL:%.*]]
426
426
; CHECK: normal:
427
427
; CHECK-NEXT: ret void
428
428
; CHECK: unreached:
@@ -560,3 +560,75 @@ unreached:
560
560
call void @use (i32 %result )
561
561
ret void
562
562
}
563
+
564
+ define i32 @smax_smin_to_scmp (i32 %x ) {
565
+ ; CHECK-LABEL: define i32 @smax_smin_to_scmp
566
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
567
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)
568
+ ; CHECK-NEXT: ret i32 [[COND5]]
569
+ ;
570
+ %cond = call i32 @llvm.smax.i32 (i32 %x , i32 -1 )
571
+ %cond5 = call i32 @llvm.smin.i32 (i32 %cond , i32 1 )
572
+ ret i32 %cond5
573
+ }
574
+
575
+ define i16 @smax_smin_to_scmp_i16 (i16 %x ) {
576
+ ; CHECK-LABEL: define i16 @smax_smin_to_scmp_i16
577
+ ; CHECK-SAME: (i16 [[X:%.*]]) {
578
+ ; CHECK-NEXT: [[COND5:%.*]] = call i16 @llvm.scmp.i16.i16(i16 [[X]], i16 0)
579
+ ; CHECK-NEXT: ret i16 [[COND5]]
580
+ ;
581
+ %cond = call i16 @llvm.smax.i16 (i16 %x , i16 -1 )
582
+ %cond5 = call i16 @llvm.smin.i16 (i16 %cond , i16 1 )
583
+ ret i16 %cond5
584
+ }
585
+
586
+ ; Test the reversed pattern: smax(smin(X, 1), -1) -> scmp(X, 0)
587
+ define i32 @smin_smax_to_scmp (i32 %x ) {
588
+ ; CHECK-LABEL: define i32 @smin_smax_to_scmp
589
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
590
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.scmp.i32.i32(i32 [[X]], i32 0)
591
+ ; CHECK-NEXT: ret i32 [[COND5]]
592
+ ;
593
+ %cond = call i32 @llvm.smin.i32 (i32 %x , i32 1 )
594
+ %cond5 = call i32 @llvm.smax.i32 (i32 %cond , i32 -1 )
595
+ ret i32 %cond5
596
+ }
597
+
598
+ define i32 @test_max_min_neg (i32 %x ) {
599
+ ; CHECK-LABEL: define i32 @test_max_min_neg
600
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
601
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -2)
602
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
603
+ ; CHECK-NEXT: ret i32 [[COND5]]
604
+ ;
605
+ %cond = call i32 @llvm.smax.i32 (i32 %x , i32 -2 )
606
+ %cond5 = call i32 @llvm.smin.i32 (i32 %cond , i32 1 )
607
+ ret i32 %cond5
608
+ }
609
+
610
+ define i32 @test_max_min_neg_2 (i32 %x ) {
611
+ ; CHECK-LABEL: define i32 @test_max_min_neg_2
612
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
613
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
614
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 2)
615
+ ; CHECK-NEXT: ret i32 [[COND5]]
616
+ ;
617
+ %cond = call i32 @llvm.smax.i32 (i32 %x , i32 -1 )
618
+ %cond5 = call i32 @llvm.smin.i32 (i32 %cond , i32 2 )
619
+ ret i32 %cond5
620
+ }
621
+
622
+ define i32 @test_multiple_uses (i32 %x ) {
623
+ ; CHECK-LABEL: define i32 @test_multiple_uses
624
+ ; CHECK-SAME: (i32 [[X:%.*]]) {
625
+ ; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
626
+ ; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
627
+ ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[COND]], [[COND5]]
628
+ ; CHECK-NEXT: ret i32 [[SUM]]
629
+ ;
630
+ %cond = call i32 @llvm.smax.i32 (i32 %x , i32 -1 )
631
+ %cond5 = call i32 @llvm.smin.i32 (i32 %cond , i32 1 )
632
+ %sum = add i32 %cond , %cond5
633
+ ret i32 %sum
634
+ }
0 commit comments