Skip to content

Commit aae0023

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 1ca0055 commit aae0023

File tree

2 files changed

+663
-30
lines changed

2 files changed

+663
-30
lines changed

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)