xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/switch-dup-bbs.ll (revision d26df3225537f3f9dc283f4fb33d191d11802d8c)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S \
3; RUN:   | FileCheck %s -check-prefix=SIMPLIFY-CFG
4
5define i32 @switch_all_duplicate_arms(i32 %0, i32 %1, i32 %2, i32 %3) {
6; SIMPLIFY-CFG-LABEL: define i32 @switch_all_duplicate_arms(
7; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]]) {
8; SIMPLIFY-CFG-NEXT:    switch i32 [[TMP1]], label %[[BB6:.*]] [
9; SIMPLIFY-CFG-NEXT:      i32 0, label %[[BB5:.*]]
10; SIMPLIFY-CFG-NEXT:      i32 1, label %[[BB5]]
11; SIMPLIFY-CFG-NEXT:    ]
12; SIMPLIFY-CFG:       [[BB5]]:
13; SIMPLIFY-CFG-NEXT:    br label %[[BB6]]
14; SIMPLIFY-CFG:       [[BB6]]:
15; SIMPLIFY-CFG-NEXT:    [[TMP8:%.*]] = phi i32 [ [[TMP3]], [[TMP4:%.*]] ], [ [[TMP2]], %[[BB5]] ]
16; SIMPLIFY-CFG-NEXT:    ret i32 [[TMP8]]
17;
18  switch i32 %1, label %7 [
19  i32 0, label %5
20  i32 1, label %6
21  ]
22
235:
24  br label %7
25
266:
27  br label %7
28
297:
30  %8 = phi i32 [ %3, %4 ], [ %2, %6 ], [ %2, %5 ]
31  ret i32 %8
32}
33
34define i32 @switch_some_duplicate_arms(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
35; SIMPLIFY-CFG-LABEL: define i32 @switch_some_duplicate_arms(
36; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]]) {
37; SIMPLIFY-CFG-NEXT:    switch i32 [[TMP1]], label %[[BB8:.*]] [
38; SIMPLIFY-CFG-NEXT:      i32 0, label %[[BB6:.*]]
39; SIMPLIFY-CFG-NEXT:      i32 1, label %[[BB6]]
40; SIMPLIFY-CFG-NEXT:      i32 2, label %[[BB7:.*]]
41; SIMPLIFY-CFG-NEXT:    ]
42; SIMPLIFY-CFG:       [[BB6]]:
43; SIMPLIFY-CFG-NEXT:    br label %[[BB8]]
44; SIMPLIFY-CFG:       [[BB7]]:
45; SIMPLIFY-CFG-NEXT:    br label %[[BB8]]
46; SIMPLIFY-CFG:       [[BB8]]:
47; SIMPLIFY-CFG-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP3]], [[TMP5:%.*]] ], [ [[TMP4]], %[[BB7]] ], [ [[TMP2]], %[[BB6]] ]
48; SIMPLIFY-CFG-NEXT:    ret i32 [[TMP10]]
49;
50  switch i32 %1, label %9 [
51  i32 0, label %6
52  i32 1, label %7
53  i32 2, label %8
54  ]
55
566:
57  br label %9
58
597:
60  br label %9
61
628:
63  br label %9
64
659:
66  %10 = phi i32 [ %3, %5 ], [ %4, %8 ], [ %2, %7 ], [ %2, %6 ]
67  ret i32 %10
68}
69
70define i32 @switch_duplicate_arms_multipred(i1 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
71; SIMPLIFY-CFG-LABEL: define i32 @switch_duplicate_arms_multipred(
72; SIMPLIFY-CFG-SAME: i1 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]], i32 [[TMP4:%.*]]) {
73; SIMPLIFY-CFG-NEXT:    br i1 [[TMP0]], label %[[BB6:.*]], label %[[BB7:.*]]
74; SIMPLIFY-CFG:       [[BB6]]:
75; SIMPLIFY-CFG-NEXT:    switch i32 [[TMP2]], label %[[BB9:.*]] [
76; SIMPLIFY-CFG-NEXT:      i32 0, label %[[BB7]]
77; SIMPLIFY-CFG-NEXT:      i32 1, label %[[BB8:.*]]
78; SIMPLIFY-CFG-NEXT:    ]
79; SIMPLIFY-CFG:       [[BB7]]:
80; SIMPLIFY-CFG-NEXT:    br label %[[BB9]]
81; SIMPLIFY-CFG:       [[BB8]]:
82; SIMPLIFY-CFG-NEXT:    br label %[[BB9]]
83; SIMPLIFY-CFG:       [[BB9]]:
84; SIMPLIFY-CFG-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP4]], %[[BB6]] ], [ [[TMP3]], %[[BB8]] ], [ [[TMP3]], %[[BB7]] ]
85; SIMPLIFY-CFG-NEXT:    ret i32 [[TMP10]]
86;
87  br i1 %0, label %6, label %7
886:
89  switch i32 %2, label %9 [
90  i32 0, label %7
91  i32 1, label %8
92  ]
93
947:
95  br label %9
96
978:
98  br label %9
99
1009:
101  %10 = phi i32 [ %4, %6 ], [ %3, %8 ], [ %3, %7 ]
102  ret i32 %10
103}
104
105define i32 @switch_dup_default(i32 %0, i32 %1, i32 %2, i32 %3) {
106; SIMPLIFY-CFG-LABEL: define i32 @switch_dup_default(
107; SIMPLIFY-CFG-SAME: i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[TMP3:%.*]]) {
108; SIMPLIFY-CFG-NEXT:    [[COND:%.*]] = icmp eq i32 [[TMP1]], 0
109; SIMPLIFY-CFG-NEXT:    [[TMP8:%.*]] = select i1 [[COND]], i32 [[TMP3]], i32 [[TMP2]]
110; SIMPLIFY-CFG-NEXT:    ret i32 [[TMP8]]
111;
112  switch i32 %1, label %7 [
113  i32 0, label %5
114  i32 1, label %6
115  ]
116
1175:
118  br label %8
119
1206:
121  br label %8
122
1237:
124  br label %8
125
1268:
127  %9 = phi i32 [ %3, %5 ], [ %2, %6 ], [ %2, %7 ]
128  ret i32 %9
129}
130
131define i32 @switch_dup_exit(i32 %val) {
132; SIMPLIFY-CFG-LABEL: define i32 @switch_dup_exit(
133; SIMPLIFY-CFG-SAME: i32 [[VAL:%.*]]) {
134; SIMPLIFY-CFG-NEXT:  [[ENTRY:.*]]:
135; SIMPLIFY-CFG-NEXT:    switch i32 [[VAL]], label %[[DEFAULT:.*]] [
136; SIMPLIFY-CFG-NEXT:      i32 1, label %[[EXIT:.*]]
137; SIMPLIFY-CFG-NEXT:      i32 11, label %[[EXIT]]
138; SIMPLIFY-CFG-NEXT:      i32 22, label %[[BB1:.*]]
139; SIMPLIFY-CFG-NEXT:    ]
140; SIMPLIFY-CFG:       [[BB1]]:
141; SIMPLIFY-CFG-NEXT:    br label %[[EXIT]]
142; SIMPLIFY-CFG:       [[DEFAULT]]:
143; SIMPLIFY-CFG-NEXT:    br label %[[EXIT]]
144; SIMPLIFY-CFG:       [[EXIT]]:
145; SIMPLIFY-CFG-NEXT:    [[RET:%.*]] = phi i32 [ 0, %[[DEFAULT]] ], [ 3, %[[BB1]] ], [ 1, %[[ENTRY]] ], [ 1, %[[ENTRY]] ]
146; SIMPLIFY-CFG-NEXT:    ret i32 [[RET]]
147;
148entry:
149  switch i32 %val, label %default [
150  i32 1, label %exit
151  i32 11, label %exit
152  i32 22, label %bb1
153  i32 15, label %bb2
154  i32 0, label %bb2
155  ]
156
157bb1:
158  br label %exit
159
160bb2:
161  br label %exit
162
163default:
164  br label %exit
165
166exit:
167  %ret = phi i32 [ 0, %default ], [ 0, %bb2 ], [ 3, %bb1 ], [ 1, %entry ], [ 1, %entry ]
168  ret i32 %ret
169}
170
171define i64 @switch_dup_exit_2(i32 %val) {
172; SIMPLIFY-CFG-LABEL: define i64 @switch_dup_exit_2(
173; SIMPLIFY-CFG-SAME: i32 [[VAL:%.*]]) {
174; SIMPLIFY-CFG-NEXT:  [[ENTRY:.*:]]
175; SIMPLIFY-CFG-NEXT:    [[SWITCH_SELECTCMP_CASE1:%.*]] = icmp eq i32 [[VAL]], 1
176; SIMPLIFY-CFG-NEXT:    [[SWITCH_SELECTCMP_CASE2:%.*]] = icmp eq i32 [[VAL]], 11
177; SIMPLIFY-CFG-NEXT:    [[SWITCH_SELECTCMP:%.*]] = or i1 [[SWITCH_SELECTCMP_CASE1]], [[SWITCH_SELECTCMP_CASE2]]
178; SIMPLIFY-CFG-NEXT:    [[RET:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 1, i64 0
179; SIMPLIFY-CFG-NEXT:    ret i64 [[RET]]
180;
181entry:
182  switch i32 %val, label %default [
183  i32 1, label %bb2
184  i32 11, label %exit
185  i32 13, label %bb1
186  i32 0, label %bb1
187  ]
188
189bb1:
190  br label %exit
191
192bb2:
193  br label %exit
194
195default:
196  br label %exit
197
198exit:
199  %ret = phi i64 [ 0, %default ], [ 0, %bb1 ], [ 1, %entry ], [ 1, %bb2 ]
200  ret i64 %ret
201}
202