@@ -154,6 +154,147 @@ bees:
154154 unreachable
155155}
156156
157+ define void @pr165179 (i1 %cond ) {
158+ ; CHECK-LABEL: @pr165179(
159+ ; CHECK-NEXT: entry:
160+ ; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
161+ ; CHECK: if.then:
162+ ; CHECK-NEXT: tail call void @bees.a() #[[ATTR0]]
163+ ; CHECK-NEXT: br label [[SWITCHBB:%.*]]
164+ ; CHECK: if.else:
165+ ; CHECK-NEXT: tail call void @bees.b() #[[ATTR0]]
166+ ; CHECK-NEXT: br label [[SWITCHBB]]
167+ ; CHECK: switchbb:
168+ ; CHECK-NEXT: [[COND1:%.*]] = phi i32 [ 1, [[IF_ELSE]] ], [ -1, [[IF_THEN]] ]
169+ ; CHECK-NEXT: switch i32 [[COND1]], label [[DEFAULT:%.*]] [
170+ ; CHECK-NEXT: i32 1, label [[EXIT:%.*]]
171+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
172+ ; CHECK-NEXT: ]
173+ ; CHECK: common.ret:
174+ ; CHECK-NEXT: ret void
175+ ; CHECK: exit:
176+ ; CHECK-NEXT: tail call void @bees.a() #[[ATTR0]]
177+ ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
178+ ; CHECK: default:
179+ ; CHECK-NEXT: tail call void @bees.b() #[[ATTR0]]
180+ ; CHECK-NEXT: br label [[COMMON_RET]]
181+ ;
182+ entry:
183+ br i1 %cond , label %if.then , label %if.else
184+
185+ if.then:
186+ tail call void @bees.a () nounwind
187+ br label %switchbb
188+
189+ if.else:
190+ tail call void @bees.b () nounwind
191+ br label %switchbb
192+
193+ switchbb:
194+ %cond1 = phi i32 [ 1 , %if.else ], [ -1 , %if.then ]
195+ switch i32 %cond1 , label %default [
196+ i32 1 , label %exit
197+ i32 -1 , label %exit
198+ ]
199+
200+ exit:
201+ tail call void @bees.a () nounwind
202+ ret void
203+
204+ default:
205+ tail call void @bees.b () nounwind
206+ ret void
207+ }
208+
209+ define void @switch_remove_dead_case_phi (i1 %cond1 , i1 %cond2 ) {
210+ ; CHECK-LABEL: @switch_remove_dead_case_phi(
211+ ; CHECK-NEXT: entry:
212+ ; CHECK-NEXT: br i1 [[COND1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
213+ ; CHECK: if.then:
214+ ; CHECK-NEXT: tail call void @bees.a() #[[ATTR0]]
215+ ; CHECK-NEXT: br i1 [[COND2:%.*]], label [[SWITCHBB:%.*]], label [[IF_ELSE]]
216+ ; CHECK: if.else:
217+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 3, [[ENTRY:%.*]] ], [ -1, [[IF_THEN]] ]
218+ ; CHECK-NEXT: tail call void @bees.b() #[[ATTR0]]
219+ ; CHECK-NEXT: br label [[SWITCHBB]]
220+ ; CHECK: switchbb:
221+ ; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[PHI]], [[IF_ELSE]] ], [ 5, [[IF_THEN]] ]
222+ ; CHECK-NEXT: switch i32 [[COND]], label [[DEFAULT:%.*]] [
223+ ; CHECK-NEXT: i32 1, label [[EXIT:%.*]]
224+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
225+ ; CHECK-NEXT: ]
226+ ; CHECK: common.ret:
227+ ; CHECK-NEXT: ret void
228+ ; CHECK: exit:
229+ ; CHECK-NEXT: tail call void @bees.a() #[[ATTR0]]
230+ ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
231+ ; CHECK: default:
232+ ; CHECK-NEXT: tail call void @bees.b() #[[ATTR0]]
233+ ; CHECK-NEXT: br label [[COMMON_RET]]
234+ ;
235+ entry:
236+ br i1 %cond1 , label %if.then , label %if.else
237+
238+ if.then:
239+ tail call void @bees.a () nounwind
240+ br i1 %cond2 , label %switchbb , label %if.else
241+
242+ if.else:
243+ %phi = phi i32 [ 3 , %entry ], [ -1 , %if.then ]
244+ tail call void @bees.b () nounwind
245+ br label %switchbb
246+
247+ switchbb:
248+ %cond = phi i32 [ %phi , %if.else ], [ 5 , %if.then ]
249+ switch i32 %cond , label %default [
250+ i32 1 , label %exit
251+ i32 -1 , label %exit
252+ ]
253+
254+ exit:
255+ tail call void @bees.a () nounwind
256+ ret void
257+
258+ default:
259+ tail call void @bees.b () nounwind
260+ ret void
261+ }
262+
263+ define void @switch_remove_dead_case_select (i1 %cond1 , i1 %cond2 ) {
264+ ; CHECK-LABEL: @switch_remove_dead_case_select(
265+ ; CHECK-NEXT: entry:
266+ ; CHECK-NEXT: [[X:%.*]] = select i1 [[COND1:%.*]], i32 -1, i32 3
267+ ; CHECK-NEXT: [[Y:%.*]] = select i1 [[COND2:%.*]], i32 [[X]], i32 5
268+ ; CHECK-NEXT: switch i32 [[Y]], label [[DEFAULT:%.*]] [
269+ ; CHECK-NEXT: i32 1, label [[EXIT:%.*]]
270+ ; CHECK-NEXT: i32 -1, label [[EXIT]]
271+ ; CHECK-NEXT: ]
272+ ; CHECK: common.ret:
273+ ; CHECK-NEXT: ret void
274+ ; CHECK: exit:
275+ ; CHECK-NEXT: tail call void @bees.a() #[[ATTR0]]
276+ ; CHECK-NEXT: br label [[COMMON_RET:%.*]]
277+ ; CHECK: default:
278+ ; CHECK-NEXT: tail call void @bees.b() #[[ATTR0]]
279+ ; CHECK-NEXT: br label [[COMMON_RET]]
280+ ;
281+ entry:
282+ %x = select i1 %cond1 , i32 -1 , i32 3
283+ %y = select i1 %cond2 , i32 %x , i32 5
284+ switch i32 %y , label %default [
285+ i32 1 , label %exit
286+ i32 -1 , label %exit
287+ ]
288+
289+ exit:
290+ tail call void @bees.a () nounwind
291+ ret void
292+
293+ default:
294+ tail call void @bees.b () nounwind
295+ ret void
296+ }
297+
157298declare void @llvm.trap () nounwind noreturn
158299declare void @bees.a () nounwind
159300declare void @bees.b () nounwind
0 commit comments