Skip to content

Commit 7ca168d

Browse files
committed
[SimplifyCFG] Add switch-to-select test with two equal cases (NFC)
We handle the case where we have two cases and a default all having different values, but not the case where two cases happen to have the same one. The PhaseOrdering test is a particularly bad example where this showed up.
1 parent cb44439 commit 7ca168d

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -O1 -S < %s | FileCheck %s
3+
4+
; This is a very convoluted way to write an icmp ule, which comes about by
5+
; matching against a three-way comparison result.
6+
define i1 @ule(i32 %a, i32 %b) {
7+
; CHECK-LABEL: @ule(
8+
; CHECK-NEXT: start:
9+
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
10+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[A]], [[B]]
11+
; CHECK-NEXT: [[CMP3:%.*]] = icmp ne i32 [[A]], [[B]]
12+
; CHECK-NEXT: [[ZEXT:%.*]] = zext i1 [[CMP3]] to i64
13+
; CHECK-NEXT: [[SEL1:%.*]] = select i1 [[CMP2]], i64 -1, i64 [[ZEXT]]
14+
; CHECK-NEXT: [[SEL2:%.*]] = select i1 [[CMP1]], i64 0, i64 [[SEL1]]
15+
; CHECK-NEXT: switch i64 [[SEL2]], label [[EXIT:%.*]] [
16+
; CHECK-NEXT: i64 -1, label [[BB:%.*]]
17+
; CHECK-NEXT: i64 0, label [[BB]]
18+
; CHECK-NEXT: ]
19+
; CHECK: bb:
20+
; CHECK-NEXT: br label [[EXIT]]
21+
; CHECK: exit:
22+
; CHECK-NEXT: [[RES:%.*]] = phi i1 [ true, [[BB]] ], [ false, [[START:%.*]] ]
23+
; CHECK-NEXT: ret i1 [[RES]]
24+
;
25+
start:
26+
%cmp1 = icmp eq i32 %a, %b
27+
%cmp2 = icmp ult i32 %a, %b
28+
%cmp3 = icmp ne i32 %a, %b
29+
%zext = zext i1 %cmp3 to i64
30+
%sel1 = select i1 %cmp2, i64 -1, i64 %zext
31+
%sel2 = select i1 %cmp1, i64 0, i64 %sel1
32+
switch i64 %sel2, label %exit [
33+
i64 -1, label %bb
34+
i64 0, label %bb
35+
]
36+
37+
bb:
38+
br label %exit
39+
40+
exit:
41+
%res = phi i1 [ true, %bb ], [ false, %start ]
42+
ret i1 %res
43+
}

llvm/test/Transforms/SimplifyCFG/switch-to-select-two-case.ll

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
23

34
; int foo1_with_default(int a) {
@@ -13,9 +14,9 @@
1314
define i32 @foo1_with_default(i32 %a) {
1415
; CHECK-LABEL: @foo1_with_default(
1516
; CHECK-NEXT: entry:
16-
; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 %a, 20
17-
; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP:%.*]], i32 2, i32 4
18-
; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 %a, 10
17+
; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i32 [[A:%.*]], 20
18+
; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i32 2, i32 4
19+
; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i32 [[A]], 10
1920
; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i32 10, i32 [[SWITCH_SELECT]]
2021
; CHECK-NEXT: ret i32 [[SWITCH_SELECT2]]
2122
;
@@ -39,3 +40,33 @@ return:
3940
ret i32 %retval.0
4041
}
4142

43+
; Same as above, but both cases have the same value.
44+
define i32 @same_value(i32 %a) {
45+
; CHECK-LABEL: @same_value(
46+
; CHECK-NEXT: entry:
47+
; CHECK-NEXT: switch i32 [[A:%.*]], label [[SW_EPILOG:%.*]] [
48+
; CHECK-NEXT: i32 10, label [[RETURN:%.*]]
49+
; CHECK-NEXT: i32 20, label [[RETURN]]
50+
; CHECK-NEXT: ]
51+
; CHECK: sw.epilog:
52+
; CHECK-NEXT: br label [[RETURN]]
53+
; CHECK: return:
54+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 4, [[SW_EPILOG]] ], [ 10, [[ENTRY:%.*]] ], [ 10, [[ENTRY]] ]
55+
; CHECK-NEXT: ret i32 [[RETVAL_0]]
56+
;
57+
entry:
58+
switch i32 %a, label %sw.epilog [
59+
i32 10, label %sw.bb
60+
i32 20, label %sw.bb
61+
]
62+
63+
sw.bb:
64+
br label %return
65+
66+
sw.epilog:
67+
br label %return
68+
69+
return:
70+
%retval.0 = phi i32 [ 4, %sw.epilog ], [ 10, %sw.bb ]
71+
ret i32 %retval.0
72+
}

0 commit comments

Comments
 (0)