1 ; RUN: opt < %s -simplifycfg -S | FileCheck %s
3 ; Test that we can thread a simple known condition through switch statements.
11 define void @test1(i32 %V) {
12 switch i32 %V, label %A [
17 ;; V == 4 if we get here.
20 ;; This switch is always statically determined.
21 switch i32 %V, label %A2 [
30 %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
31 br i1 %cond2, label %Done, label %C
35 %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1]
36 br i1 %cond, label %Done, label %C
37 Done: ; preds = %B, %A, %A2, %0
42 %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
43 br i1 %cond3, label %Done, label %C
44 C: ; preds = %B, %A, %A2, %T, %T
48 ; CHECK-LABEL: @test1(
49 ; CHECK-NEXT: switch i32 %V, label %A [
50 ; CHECK-NEXT: i32 4, label %T
51 ; CHECK-NEXT: i32 17, label %Done
54 ; CHECK-NEXT: call void @foo1()
55 ; CHECK-NEXT: call void @foo2()
56 ; CHECK-NEXT: br label %Done
58 ; CHECK-NEXT: call void @foo1()
59 ; CHECK-NEXT: br label %Done
61 ; CHECK-NEXT: ret void
64 define void @test2(i32 %V) {
65 switch i32 %V, label %A [
70 ;; V != 4, 17, 1234 here.
73 ;; This switch is always statically determined.
74 switch i32 %V, label %E [
93 ; CHECK-LABEL: @test2(
94 ; CHECK-NEXT: switch i32 %V, label %A [
95 ; CHECK-NEXT: i32 4, label %T
96 ; CHECK-NEXT: i32 17, label %D
97 ; CHECK-NEXT: i32 1234, label %E
100 ; CHECK-NEXT: call void @foo1()
101 ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 %V, 42
102 ; CHECK-NEXT: br i1 [[COND]], label %D, label %E
104 ; CHECK-NEXT: call void @foo1()
105 ; CHECK-NEXT: call void @foo1()
106 ; CHECK-NEXT: ret void
108 ; CHECK-NEXT: call void @foo1()
109 ; CHECK-NEXT: ret void
111 ; CHECK-NEXT: ret void