@@ -34,3 +34,103 @@ return:
3434 %phi = phi i32 [ 3 , %bb1 ], [ 2 , %bb2 ], [ 1 , %bb3 ], [ 0 , %bb4 ], [ 42 , %bb5 ]
3535 ret i32 %phi
3636}
37+
38+ define i32 @switch_of_powers_two_default_reachable (i32 %arg ) {
39+ ; CHECK-LABEL: define i32 @switch_of_powers_two_default_reachable(
40+ ; CHECK-SAME: i32 [[ARG:%.*]]) {
41+ ; CHECK-NEXT: [[ENTRY:.*]]:
42+ ; CHECK-NEXT: switch i32 [[ARG]], label %[[RETURN:.*]] [
43+ ; CHECK-NEXT: i32 1, label %[[BB1:.*]]
44+ ; CHECK-NEXT: i32 8, label %[[BB2:.*]]
45+ ; CHECK-NEXT: i32 16, label %[[BB3:.*]]
46+ ; CHECK-NEXT: i32 32, label %[[BB4:.*]]
47+ ; CHECK-NEXT: i32 64, label %[[BB5:.*]]
48+ ; CHECK-NEXT: ]
49+ ; CHECK: [[BB1]]:
50+ ; CHECK-NEXT: br label %[[RETURN]]
51+ ; CHECK: [[BB2]]:
52+ ; CHECK-NEXT: br label %[[RETURN]]
53+ ; CHECK: [[BB3]]:
54+ ; CHECK-NEXT: br label %[[RETURN]]
55+ ; CHECK: [[BB4]]:
56+ ; CHECK-NEXT: br label %[[RETURN]]
57+ ; CHECK: [[BB5]]:
58+ ; CHECK-NEXT: br label %[[RETURN]]
59+ ; CHECK: [[RETURN]]:
60+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 3, %[[BB1]] ], [ 2, %[[BB2]] ], [ 1, %[[BB3]] ], [ 0, %[[BB4]] ], [ 42, %[[BB5]] ], [ 5, %[[ENTRY]] ]
61+ ; CHECK-NEXT: ret i32 [[PHI]]
62+ ;
63+ entry:
64+ switch i32 %arg , label %default_case [
65+ i32 1 , label %bb1
66+ i32 8 , label %bb2
67+ i32 16 , label %bb3
68+ i32 32 , label %bb4
69+ i32 64 , label %bb5
70+ ]
71+
72+ default_case: br label %return
73+ bb1: br label %return
74+ bb2: br label %return
75+ bb3: br label %return
76+ bb4: br label %return
77+ bb5: br label %return
78+
79+ return:
80+ %phi = phi i32 [ 3 , %bb1 ], [ 2 , %bb2 ], [ 1 , %bb3 ], [ 0 , %bb4 ], [ 42 , %bb5 ], [ 5 , %default_case ]
81+ ret i32 %phi
82+ }
83+
84+ define i32 @switch_of_powers_two_default_reachable_multipreds (i32 %arg , i1 %cond ) {
85+ ; CHECK-LABEL: define i32 @switch_of_powers_two_default_reachable_multipreds(
86+ ; CHECK-SAME: i32 [[ARG:%.*]], i1 [[COND:%.*]]) {
87+ ; CHECK-NEXT: [[ENTRY:.*]]:
88+ ; CHECK-NEXT: br i1 [[COND]], label %[[SWITCH:.*]], label %[[RETURN:.*]]
89+ ; CHECK: [[SWITCH]]:
90+ ; CHECK-NEXT: switch i32 [[ARG]], label %[[RETURN]] [
91+ ; CHECK-NEXT: i32 1, label %[[BB1:.*]]
92+ ; CHECK-NEXT: i32 8, label %[[BB2:.*]]
93+ ; CHECK-NEXT: i32 16, label %[[BB3:.*]]
94+ ; CHECK-NEXT: i32 32, label %[[BB4:.*]]
95+ ; CHECK-NEXT: i32 64, label %[[BB5:.*]]
96+ ; CHECK-NEXT: ]
97+ ; CHECK: [[BB1]]:
98+ ; CHECK-NEXT: br label %[[RETURN]]
99+ ; CHECK: [[BB2]]:
100+ ; CHECK-NEXT: br label %[[RETURN]]
101+ ; CHECK: [[BB3]]:
102+ ; CHECK-NEXT: br label %[[RETURN]]
103+ ; CHECK: [[BB4]]:
104+ ; CHECK-NEXT: br label %[[RETURN]]
105+ ; CHECK: [[BB5]]:
106+ ; CHECK-NEXT: br label %[[RETURN]]
107+ ; CHECK: [[RETURN]]:
108+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 3, %[[BB1]] ], [ 2, %[[BB2]] ], [ 1, %[[BB3]] ], [ 0, %[[BB4]] ], [ 42, %[[BB5]] ], [ 0, %[[ENTRY]] ], [ [[ARG]], %[[SWITCH]] ]
109+ ; CHECK-NEXT: ret i32 [[PHI]]
110+ ;
111+ entry:
112+ br i1 %cond , label %switch , label %default_case
113+
114+ switch:
115+ switch i32 %arg , label %default_case [
116+ i32 1 , label %bb1
117+ i32 8 , label %bb2
118+ i32 16 , label %bb3
119+ i32 32 , label %bb4
120+ i32 64 , label %bb5
121+ ]
122+
123+ default_case:
124+ %pn = phi i32 [ 0 , %entry ], [ %arg , %switch ]
125+ br label %return
126+
127+ bb1: br label %return
128+ bb2: br label %return
129+ bb3: br label %return
130+ bb4: br label %return
131+ bb5: br label %return
132+
133+ return:
134+ %phi = phi i32 [ 3 , %bb1 ], [ 2 , %bb2 ], [ 1 , %bb3 ], [ 0 , %bb4 ], [ 42 , %bb5 ], [ %pn , %default_case ]
135+ ret i32 %phi
136+ }
0 commit comments