Skip to content

Commit b16eb26

Browse files
committed
[InstCombine] Pre-commit tests (NFC)
1 parent 526701f commit b16eb26

File tree

1 file changed

+84
-21
lines changed

1 file changed

+84
-21
lines changed

llvm/test/Transforms/InstCombine/compare-3way.ll

Lines changed: 84 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
declare void @use(i32)
55

6-
; These 18 exercise all combinations of signed comparison
6+
; These exercise all combinations of signed comparison
77
; for each of the three values produced by your typical
88
; 3way compare function (-1, 0, 1)
99

@@ -81,8 +81,8 @@ unreached:
8181
define void @test_low_sle(i64 %a, i64 %b) {
8282
; CHECK-LABEL: define void @test_low_sle
8383
; 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:%.*]]
8686
; CHECK: normal:
8787
; CHECK-NEXT: ret void
8888
; CHECK: unreached:
@@ -105,8 +105,8 @@ unreached:
105105
define void @test_low_ne(i64 %a, i64 %b) {
106106
; CHECK-LABEL: define void @test_low_ne
107107
; 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:%.*]]
110110
; CHECK: normal:
111111
; CHECK-NEXT: ret void
112112
; CHECK: unreached:
@@ -130,8 +130,8 @@ unreached:
130130
define void @test_low_eq(i64 %a, i64 %b) {
131131
; CHECK-LABEL: define void @test_low_eq
132132
; 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:%.*]]
135135
; CHECK: normal:
136136
; CHECK-NEXT: ret void
137137
; CHECK: unreached:
@@ -154,8 +154,8 @@ unreached:
154154
define void @test_mid_sgt(i64 %a, i64 %b) {
155155
; CHECK-LABEL: define void @test_mid_sgt
156156
; 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:%.*]]
159159
; CHECK: normal:
160160
; CHECK-NEXT: ret void
161161
; CHECK: unreached:
@@ -178,8 +178,8 @@ unreached:
178178
define void @test_mid_slt(i64 %a, i64 %b) {
179179
; CHECK-LABEL: define void @test_mid_slt
180180
; 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:%.*]]
183183
; CHECK: normal:
184184
; CHECK-NEXT: ret void
185185
; CHECK: unreached:
@@ -252,8 +252,8 @@ unreached:
252252
define void @test_mid_ne(i64 %a, i64 %b) {
253253
; CHECK-LABEL: define void @test_mid_ne
254254
; 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:%.*]]
257257
; CHECK: normal:
258258
; CHECK-NEXT: ret void
259259
; CHECK: unreached:
@@ -277,8 +277,8 @@ unreached:
277277
define void @test_mid_eq(i64 %a, i64 %b) {
278278
; CHECK-LABEL: define void @test_mid_eq
279279
; 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:%.*]]
282282
; CHECK: normal:
283283
; CHECK-NEXT: ret void
284284
; CHECK: unreached:
@@ -348,8 +348,8 @@ unreached:
348348
define void @test_high_sge(i64 %a, i64 %b) {
349349
; CHECK-LABEL: define void @test_high_sge
350350
; 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:%.*]]
353353
; CHECK: normal:
354354
; CHECK-NEXT: ret void
355355
; CHECK: unreached:
@@ -396,8 +396,8 @@ unreached:
396396
define void @test_high_ne(i64 %a, i64 %b) {
397397
; CHECK-LABEL: define void @test_high_ne
398398
; 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:%.*]]
401401
; CHECK: normal:
402402
; CHECK-NEXT: ret void
403403
; CHECK: unreached:
@@ -421,8 +421,8 @@ unreached:
421421
define void @test_high_eq(i64 %a, i64 %b) {
422422
; CHECK-LABEL: define void @test_high_eq
423423
; 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:%.*]]
426426
; CHECK: normal:
427427
; CHECK-NEXT: ret void
428428
; CHECK: unreached:
@@ -560,3 +560,66 @@ unreached:
560560
call void @use(i32 %result)
561561
ret void
562562
}
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: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
568+
; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
569+
; CHECK-NEXT: ret i32 [[COND5]]
570+
;
571+
%cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)
572+
%cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)
573+
ret i32 %cond5
574+
}
575+
576+
define i16 @smax_smin_to_scmp_i16(i16 %x) {
577+
; CHECK-LABEL: define i16 @smax_smin_to_scmp_i16
578+
; CHECK-SAME: (i16 [[X:%.*]]) {
579+
; CHECK-NEXT: [[COND:%.*]] = call i16 @llvm.smax.i16(i16 [[X]], i16 -1)
580+
; CHECK-NEXT: [[COND5:%.*]] = call i16 @llvm.smin.i16(i16 [[COND]], i16 1)
581+
; CHECK-NEXT: ret i16 [[COND5]]
582+
;
583+
%cond = call i16 @llvm.smax.i16(i16 %x, i16 -1)
584+
%cond5 = call i16 @llvm.smin.i16(i16 %cond, i16 1)
585+
ret i16 %cond5
586+
}
587+
588+
; Test the reversed pattern: smax(smin(X, 1), -1) -> scmp(X, 0)
589+
define i32 @smin_smax_to_scmp(i32 %x) {
590+
; CHECK-LABEL: define i32 @smin_smax_to_scmp
591+
; CHECK-SAME: (i32 [[X:%.*]]) {
592+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
593+
; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 1)
594+
; CHECK-NEXT: ret i32 [[COND5]]
595+
;
596+
%cond = call i32 @llvm.smin.i32(i32 %x, i32 1)
597+
%cond5 = call i32 @llvm.smax.i32(i32 %cond, i32 -1)
598+
ret i32 %cond5
599+
}
600+
601+
define i32 @test_max_min_neg(i32 %x) {
602+
; CHECK-LABEL: define i32 @test_max_min_neg
603+
; CHECK-SAME: (i32 [[X:%.*]]) {
604+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -2)
605+
; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
606+
; CHECK-NEXT: ret i32 [[COND5]]
607+
;
608+
%cond = call i32 @llvm.smax.i32(i32 %x, i32 -2)
609+
%cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)
610+
ret i32 %cond5
611+
}
612+
613+
define i32 @test_multiple_uses(i32 %x) {
614+
; CHECK-LABEL: define i32 @test_multiple_uses
615+
; CHECK-SAME: (i32 [[X:%.*]]) {
616+
; CHECK-NEXT: [[COND:%.*]] = call i32 @llvm.smax.i32(i32 [[X]], i32 -1)
617+
; CHECK-NEXT: [[COND5:%.*]] = call i32 @llvm.smin.i32(i32 [[COND]], i32 1)
618+
; CHECK-NEXT: [[SUM:%.*]] = add i32 [[COND]], [[COND5]]
619+
; CHECK-NEXT: ret i32 [[SUM]]
620+
;
621+
%cond = call i32 @llvm.smax.i32(i32 %x, i32 -1)
622+
%cond5 = call i32 @llvm.smin.i32(i32 %cond, i32 1)
623+
%sum = add i32 %cond, %cond5
624+
ret i32 %sum
625+
}

0 commit comments

Comments
 (0)