Skip to content

Commit e15d3ed

Browse files
committed
[SimplifyCFG] Add tests for big lookup tables which exceed the mask size and lookup tables with reachable/unreachable default cases
1 parent 50d837e commit e15d3ed

File tree

3 files changed

+1795
-61
lines changed

3 files changed

+1795
-61
lines changed

llvm/test/Transforms/SimplifyCFG/RISCV/switch-of-powers-of-two.ll

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ define i32 @switch_of_powers(i32 %x) {
1111
; RV64I-LABEL: @switch_of_powers(
1212
; RV64I-NEXT: entry:
1313
; RV64I-NEXT: switch i32 [[X:%.*]], label [[DEFAULT_CASE:%.*]] [
14-
; RV64I-NEXT: i32 1, label [[RETURN:%.*]]
15-
; RV64I-NEXT: i32 8, label [[BB2:%.*]]
16-
; RV64I-NEXT: i32 16, label [[BB3:%.*]]
17-
; RV64I-NEXT: i32 32, label [[BB4:%.*]]
18-
; RV64I-NEXT: i32 64, label [[BB5:%.*]]
14+
; RV64I-NEXT: i32 1, label [[RETURN:%.*]]
15+
; RV64I-NEXT: i32 8, label [[BB2:%.*]]
16+
; RV64I-NEXT: i32 16, label [[BB3:%.*]]
17+
; RV64I-NEXT: i32 32, label [[BB4:%.*]]
18+
; RV64I-NEXT: i32 64, label [[BB5:%.*]]
1919
; RV64I-NEXT: ]
2020
; RV64I: default_case:
2121
; RV64I-NEXT: unreachable
@@ -69,11 +69,11 @@ define i32 @switch_of_powers_reachable_default(i32 %x) {
6969
; CHECK-LABEL: @switch_of_powers_reachable_default(
7070
; CHECK-NEXT: entry:
7171
; CHECK-NEXT: switch i32 [[X:%.*]], label [[RETURN:%.*]] [
72-
; CHECK-NEXT: i32 1, label [[BB1:%.*]]
73-
; CHECK-NEXT: i32 8, label [[BB2:%.*]]
74-
; CHECK-NEXT: i32 16, label [[BB3:%.*]]
75-
; CHECK-NEXT: i32 32, label [[BB4:%.*]]
76-
; CHECK-NEXT: i32 64, label [[BB5:%.*]]
72+
; CHECK-NEXT: i32 1, label [[BB1:%.*]]
73+
; CHECK-NEXT: i32 8, label [[BB2:%.*]]
74+
; CHECK-NEXT: i32 16, label [[BB3:%.*]]
75+
; CHECK-NEXT: i32 32, label [[BB4:%.*]]
76+
; CHECK-NEXT: i32 64, label [[BB5:%.*]]
7777
; CHECK-NEXT: ]
7878
; CHECK: bb1:
7979
; CHECK-NEXT: br label [[RETURN]]
@@ -116,11 +116,11 @@ define i32 @switch_of_non_powers(i32 %x) {
116116
; CHECK-LABEL: @switch_of_non_powers(
117117
; CHECK-NEXT: entry:
118118
; CHECK-NEXT: switch i32 [[X:%.*]], label [[DEFAULT_CASE:%.*]] [
119-
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
120-
; CHECK-NEXT: i32 1, label [[BB2:%.*]]
121-
; CHECK-NEXT: i32 16, label [[BB3:%.*]]
122-
; CHECK-NEXT: i32 32, label [[BB4:%.*]]
123-
; CHECK-NEXT: i32 64, label [[BB5:%.*]]
119+
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
120+
; CHECK-NEXT: i32 1, label [[BB2:%.*]]
121+
; CHECK-NEXT: i32 16, label [[BB3:%.*]]
122+
; CHECK-NEXT: i32 32, label [[BB4:%.*]]
123+
; CHECK-NEXT: i32 64, label [[BB5:%.*]]
124124
; CHECK-NEXT: ]
125125
; CHECK: default_case:
126126
; CHECK-NEXT: unreachable
@@ -162,10 +162,10 @@ define i32 @unable_to_create_dense_switch(i32 %x) {
162162
; CHECK-LABEL: @unable_to_create_dense_switch(
163163
; CHECK-NEXT: entry:
164164
; CHECK-NEXT: switch i32 [[X:%.*]], label [[DEFAULT_CASE:%.*]] [
165-
; CHECK-NEXT: i32 1, label [[RETURN:%.*]]
166-
; CHECK-NEXT: i32 2, label [[BB3:%.*]]
167-
; CHECK-NEXT: i32 4, label [[BB4:%.*]]
168-
; CHECK-NEXT: i32 4096, label [[BB5:%.*]]
165+
; CHECK-NEXT: i32 1, label [[RETURN:%.*]]
166+
; CHECK-NEXT: i32 2, label [[BB3:%.*]]
167+
; CHECK-NEXT: i32 4, label [[BB4:%.*]]
168+
; CHECK-NEXT: i32 4096, label [[BB5:%.*]]
169169
; CHECK-NEXT: ]
170170
; CHECK: default_case:
171171
; CHECK-NEXT: unreachable
@@ -205,10 +205,10 @@ define i32 @unable_to_generate_lookup_table(i32 %x, i32 %y) {
205205
; RV64I-LABEL: @unable_to_generate_lookup_table(
206206
; RV64I-NEXT: entry:
207207
; RV64I-NEXT: switch i32 [[Y:%.*]], label [[DEFAULT_CASE:%.*]] [
208-
; RV64I-NEXT: i32 1, label [[BB2:%.*]]
209-
; RV64I-NEXT: i32 2, label [[BB3:%.*]]
210-
; RV64I-NEXT: i32 8, label [[BB4:%.*]]
211-
; RV64I-NEXT: i32 64, label [[BB5:%.*]]
208+
; RV64I-NEXT: i32 1, label [[BB2:%.*]]
209+
; RV64I-NEXT: i32 2, label [[BB3:%.*]]
210+
; RV64I-NEXT: i32 8, label [[BB4:%.*]]
211+
; RV64I-NEXT: i32 64, label [[BB5:%.*]]
212212
; RV64I-NEXT: ]
213213
; RV64I: default_case:
214214
; RV64I-NEXT: unreachable
@@ -239,10 +239,10 @@ define i32 @unable_to_generate_lookup_table(i32 %x, i32 %y) {
239239
; RV64ZBB-NEXT: entry:
240240
; RV64ZBB-NEXT: [[TMP0:%.*]] = call i32 @llvm.cttz.i32(i32 [[Y:%.*]], i1 true)
241241
; RV64ZBB-NEXT: switch i32 [[TMP0]], label [[DEFAULT_CASE:%.*]] [
242-
; RV64ZBB-NEXT: i32 0, label [[BB2:%.*]]
243-
; RV64ZBB-NEXT: i32 1, label [[BB3:%.*]]
244-
; RV64ZBB-NEXT: i32 3, label [[BB4:%.*]]
245-
; RV64ZBB-NEXT: i32 6, label [[BB5:%.*]]
242+
; RV64ZBB-NEXT: i32 0, label [[BB2:%.*]]
243+
; RV64ZBB-NEXT: i32 1, label [[BB3:%.*]]
244+
; RV64ZBB-NEXT: i32 3, label [[BB4:%.*]]
245+
; RV64ZBB-NEXT: i32 6, label [[BB5:%.*]]
246246
; RV64ZBB-NEXT: ]
247247
; RV64ZBB: default_case:
248248
; RV64ZBB-NEXT: unreachable
@@ -314,10 +314,10 @@ define i128 @switch_with_long_condition(i128 %x) {
314314
; CHECK-LABEL: @switch_with_long_condition(
315315
; CHECK-NEXT: entry:
316316
; CHECK-NEXT: switch i128 [[X:%.*]], label [[DEFAULT_CASE:%.*]] [
317-
; CHECK-NEXT: i128 1, label [[RETURN:%.*]]
318-
; CHECK-NEXT: i128 2, label [[BB3:%.*]]
319-
; CHECK-NEXT: i128 4, label [[BB4:%.*]]
320-
; CHECK-NEXT: i128 32, label [[BB5:%.*]]
317+
; CHECK-NEXT: i128 1, label [[RETURN:%.*]]
318+
; CHECK-NEXT: i128 2, label [[BB3:%.*]]
319+
; CHECK-NEXT: i128 4, label [[BB4:%.*]]
320+
; CHECK-NEXT: i128 32, label [[BB5:%.*]]
321321
; CHECK-NEXT: ]
322322
; CHECK: default_case:
323323
; CHECK-NEXT: unreachable

llvm/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll

Lines changed: 81 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,10 @@ define i32 @overflow(i32 %type) {
308308
; CHECK-LABEL: @overflow(
309309
; CHECK-NEXT: entry:
310310
; CHECK-NEXT: switch i32 [[TYPE:%.*]], label [[IF_END:%.*]] [
311-
; CHECK-NEXT: i32 3, label [[SW_BB3:%.*]]
312-
; CHECK-NEXT: i32 -2147483645, label [[SW_BB3]]
313-
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
314-
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
311+
; CHECK-NEXT: i32 3, label [[SW_BB3:%.*]]
312+
; CHECK-NEXT: i32 -2147483645, label [[SW_BB3]]
313+
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
314+
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
315315
; CHECK-NEXT: ]
316316
; CHECK: sw.bb1:
317317
; CHECK-NEXT: br label [[IF_END]]
@@ -931,11 +931,11 @@ define i96 @illegaltype(i32 %c) {
931931
; CHECK-LABEL: @illegaltype(
932932
; CHECK-NEXT: entry:
933933
; CHECK-NEXT: switch i32 [[C:%.*]], label [[SW_DEFAULT:%.*]] [
934-
; CHECK-NEXT: i32 42, label [[RETURN:%.*]]
935-
; CHECK-NEXT: i32 43, label [[SW_BB1:%.*]]
936-
; CHECK-NEXT: i32 44, label [[SW_BB2:%.*]]
937-
; CHECK-NEXT: i32 45, label [[SW_BB3:%.*]]
938-
; CHECK-NEXT: i32 46, label [[SW_BB4:%.*]]
934+
; CHECK-NEXT: i32 42, label [[RETURN:%.*]]
935+
; CHECK-NEXT: i32 43, label [[SW_BB1:%.*]]
936+
; CHECK-NEXT: i32 44, label [[SW_BB2:%.*]]
937+
; CHECK-NEXT: i32 45, label [[SW_BB3:%.*]]
938+
; CHECK-NEXT: i32 46, label [[SW_BB4:%.*]]
939939
; CHECK-NEXT: ]
940940
; CHECK: sw.bb1:
941941
; CHECK-NEXT: br label [[RETURN]]
@@ -1050,9 +1050,9 @@ define i32 @threecasesholes(i32 %c) {
10501050
; CHECK-LABEL: @threecasesholes(
10511051
; CHECK-NEXT: entry:
10521052
; CHECK-NEXT: switch i32 [[C:%.*]], label [[SW_DEFAULT:%.*]] [
1053-
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1054-
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1055-
; CHECK-NEXT: i32 3, label [[SW_BB2:%.*]]
1053+
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1054+
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1055+
; CHECK-NEXT: i32 3, label [[SW_BB2:%.*]]
10561056
; CHECK-NEXT: ]
10571057
; CHECK: sw.bb1:
10581058
; CHECK-NEXT: br label [[RETURN]]
@@ -1142,9 +1142,9 @@ define ptr @tls(i32 %x) {
11421142
; CHECK-LABEL: @tls(
11431143
; CHECK-NEXT: entry:
11441144
; CHECK-NEXT: switch i32 [[X:%.*]], label [[SW_DEFAULT:%.*]] [
1145-
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1146-
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1147-
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
1145+
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1146+
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1147+
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
11481148
; CHECK-NEXT: ]
11491149
; CHECK: sw.bb1:
11501150
; CHECK-NEXT: br label [[RETURN]]
@@ -1182,9 +1182,9 @@ define ptr @dllimport(i32 %x) {
11821182
; CHECK-LABEL: @dllimport(
11831183
; CHECK-NEXT: entry:
11841184
; CHECK-NEXT: switch i32 [[X:%.*]], label [[SW_DEFAULT:%.*]] [
1185-
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1186-
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1187-
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
1185+
; CHECK-NEXT: i32 0, label [[RETURN:%.*]]
1186+
; CHECK-NEXT: i32 1, label [[SW_BB1:%.*]]
1187+
; CHECK-NEXT: i32 2, label [[SW_BB2:%.*]]
11881188
; CHECK-NEXT: ]
11891189
; CHECK: sw.bb1:
11901190
; CHECK-NEXT: br label [[RETURN]]
@@ -1476,11 +1476,11 @@ define void @pr20210(i8 %x, i1 %y) {
14761476
; CHECK-NEXT: br i1 [[Y:%.*]], label [[SW:%.*]], label [[INTERMEDIATE:%.*]]
14771477
; CHECK: sw:
14781478
; CHECK-NEXT: switch i8 [[X:%.*]], label [[END:%.*]] [
1479-
; CHECK-NEXT: i8 7, label [[INTERMEDIATE]]
1480-
; CHECK-NEXT: i8 3, label [[INTERMEDIATE]]
1481-
; CHECK-NEXT: i8 2, label [[INTERMEDIATE]]
1482-
; CHECK-NEXT: i8 1, label [[INTERMEDIATE]]
1483-
; CHECK-NEXT: i8 0, label [[INTERMEDIATE]]
1479+
; CHECK-NEXT: i8 7, label [[INTERMEDIATE]]
1480+
; CHECK-NEXT: i8 3, label [[INTERMEDIATE]]
1481+
; CHECK-NEXT: i8 2, label [[INTERMEDIATE]]
1482+
; CHECK-NEXT: i8 1, label [[INTERMEDIATE]]
1483+
; CHECK-NEXT: i8 0, label [[INTERMEDIATE]]
14841484
; CHECK-NEXT: ]
14851485
; CHECK: intermediate:
14861486
; CHECK-NEXT: [[Z:%.*]] = zext i8 [[X]] to i32
@@ -1612,15 +1612,15 @@ define void @wineh_test(i64 %val) personality ptr @__CxxFrameHandler3 {
16121612
; CHECK-LABEL: @wineh_test(
16131613
; CHECK-NEXT: entry:
16141614
; CHECK-NEXT: invoke void @throw(i1 false)
1615-
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CLEANUP1:%.*]]
1615+
; CHECK-NEXT: to label [[UNREACHABLE:%.*]] unwind label [[CLEANUP1:%.*]]
16161616
; CHECK: unreachable:
16171617
; CHECK-NEXT: unreachable
16181618
; CHECK: cleanup1:
16191619
; CHECK-NEXT: [[CLEANUPPAD1:%.*]] = cleanuppad within none []
16201620
; CHECK-NEXT: switch i64 [[VAL:%.*]], label [[CLEANUPDONE2:%.*]] [
1621-
; CHECK-NEXT: i64 0, label [[CLEANUPDONE1:%.*]]
1622-
; CHECK-NEXT: i64 1, label [[CLEANUPDONE1]]
1623-
; CHECK-NEXT: i64 6, label [[CLEANUPDONE1]]
1621+
; CHECK-NEXT: i64 0, label [[CLEANUPDONE1:%.*]]
1622+
; CHECK-NEXT: i64 1, label [[CLEANUPDONE1]]
1623+
; CHECK-NEXT: i64 6, label [[CLEANUPDONE1]]
16241624
; CHECK-NEXT: ]
16251625
; CHECK: cleanupdone1:
16261626
; CHECK-NEXT: cleanupret from [[CLEANUPPAD1]] unwind label [[CLEANUP2:%.*]]
@@ -1733,9 +1733,9 @@ define i32 @signed_overflow2(i8 %n) {
17331733
; CHECK-NEXT: start:
17341734
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[N:%.*]] to i2
17351735
; CHECK-NEXT: switch i2 [[TRUNC]], label [[BB1:%.*]] [
1736-
; CHECK-NEXT: i2 1, label [[BB6:%.*]]
1737-
; CHECK-NEXT: i2 -2, label [[BB4:%.*]]
1738-
; CHECK-NEXT: i2 -1, label [[BB5:%.*]]
1736+
; CHECK-NEXT: i2 1, label [[BB6:%.*]]
1737+
; CHECK-NEXT: i2 -2, label [[BB4:%.*]]
1738+
; CHECK-NEXT: i2 -1, label [[BB5:%.*]]
17391739
; CHECK-NEXT: ]
17401740
; CHECK: bb1:
17411741
; CHECK-NEXT: unreachable
@@ -1772,6 +1772,57 @@ bb6: ; preds = %start, %bb3, %bb4,
17721772
ret i32 %.sroa.0.0
17731773
}
17741774

1775+
; This is the same as @signed_overflow2 except that the default case calls @exit(), so it
1776+
; isn't treated as unreachable
1777+
define i32 @signed_overflow3(i8 %n) {
1778+
; CHECK-LABEL: @signed_overflow3(
1779+
; CHECK-NEXT: start:
1780+
; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[N:%.*]] to i2
1781+
; CHECK-NEXT: switch i2 [[TRUNC]], label [[START_UNREACHABLEDEFAULT:%.*]] [
1782+
; CHECK-NEXT: i2 1, label [[BB6:%.*]]
1783+
; CHECK-NEXT: i2 -2, label [[BB4:%.*]]
1784+
; CHECK-NEXT: i2 -1, label [[BB5:%.*]]
1785+
; CHECK-NEXT: i2 0, label [[BB1:%.*]]
1786+
; CHECK-NEXT: ]
1787+
; CHECK: start.unreachabledefault:
1788+
; CHECK-NEXT: unreachable
1789+
; CHECK: bb1:
1790+
; CHECK-NEXT: call void @exit(i32 1)
1791+
; CHECK-NEXT: unreachable
1792+
; CHECK: bb4:
1793+
; CHECK-NEXT: br label [[BB6]]
1794+
; CHECK: bb5:
1795+
; CHECK-NEXT: br label [[BB6]]
1796+
; CHECK: bb6:
1797+
; CHECK-NEXT: [[DOTSROA_0_0:%.*]] = phi i32 [ 4444, [[BB5]] ], [ 3333, [[BB4]] ], [ 2222, [[START:%.*]] ]
1798+
; CHECK-NEXT: ret i32 [[DOTSROA_0_0]]
1799+
;
1800+
start:
1801+
%trunc = trunc i8 %n to i2
1802+
switch i2 %trunc, label %bb1 [
1803+
i2 1, label %bb3
1804+
i2 -2, label %bb4
1805+
i2 -1, label %bb5
1806+
]
1807+
1808+
bb1: ; preds = %start
1809+
call void @exit(i32 1)
1810+
unreachable
1811+
1812+
bb3: ; preds = %start
1813+
br label %bb6
1814+
1815+
bb4: ; preds = %start
1816+
br label %bb6
1817+
1818+
bb5: ; preds = %start
1819+
br label %bb6
1820+
1821+
bb6: ; preds = %start, %bb3, %bb4, %bb5
1822+
%.sroa.0.0 = phi i32 [ 4444, %bb5 ], [ 3333, %bb4 ], [ 2222, %bb3 ]
1823+
ret i32 %.sroa.0.0
1824+
}
1825+
17751826
define i32 @signed_overflow_negative(i8 %n) {
17761827
; CHECK-LABEL: @signed_overflow_negative(
17771828
; CHECK-NEXT: start:

0 commit comments

Comments
 (0)