blob: 32767377931d4bc8c819325c18190886a5b98923 [file] [log] [blame]
Chris Lattnerfda0f1f2011-02-28 00:22:07 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -O0 %s -emit-llvm -o - | FileCheck %s
2
Chris Lattner38589382011-02-28 01:02:29 +00003// PR9322 and rdar://6970405
4
Chris Lattnerfda0f1f2011-02-28 00:22:07 +00005// CHECK: @test1
6// CHECK-NOT: switch
Chris Lattner38589382011-02-28 01:02:29 +00007// CHECK-NOT: @dead
Chris Lattnerfda0f1f2011-02-28 00:22:07 +00008// CHECK: add nsw i32 {{.*}}, 1
9// CHECK-NOT: switch
Chris Lattner38589382011-02-28 01:02:29 +000010// CHECK-NOT: @dead
Chris Lattnerfda0f1f2011-02-28 00:22:07 +000011// CHECK: ret void
Chris Lattner38589382011-02-28 01:02:29 +000012int i;
13void dead();
14
Chris Lattnerfda0f1f2011-02-28 00:22:07 +000015void test1() {
Chris Lattnerfda0f1f2011-02-28 00:22:07 +000016 switch (1)
17 case 1:
18 ++i;
19
20 switch (0)
21 case 1:
Chris Lattner38589382011-02-28 01:02:29 +000022 dead();
Chris Lattnerfda0f1f2011-02-28 00:22:07 +000023}
Chris Lattner38589382011-02-28 01:02:29 +000024
25
26// CHECK: @test2
27// CHECK-NOT: switch
28// CHECK-NOT: @dead
29// CHECK: add nsw i32 {{.*}}, 2
30// CHECK-NOT: switch
31// CHECK-NOT: @dead
32// CHECK: ret void
33void test2() {
34 switch (4) {
35 case 1:
36 dead();
37 break;
38 case 4:
39 i += 2;
40 // Fall off the end of the switch.
41 }
42}
43
44
45// CHECK: @test3
46// CHECK-NOT: switch
47// CHECK-NOT: @dead
48// CHECK: add nsw i32 {{.*}}, 2
49// CHECK-NOT: switch
50// CHECK-NOT: @dead
51// CHECK: ret void
52void test3() {
53 switch (4) {
54 case 1:
55 dead();
56 break;
57 case 4: {
58 i += 2;
59 break;
60 }
61 }
62}
63
64// CHECK: @test4
65// CHECK-NOT: switch
66// CHECK-NOT: @dead
67// CHECK: add nsw i32 {{.*}}, 2
68// CHECK-NOT: switch
69// CHECK-NOT: @dead
70// CHECK: ret void
71void test4() {
72 switch (4) {
73 case 1:
74 dead();
75 break;
76 default: {
77 i += 2;
78 break;
79 }
80 }
81}
82
83// This shouldn't crash codegen, but we don't have to optimize out the switch
84// in this case.
85void test5() {
86 switch (1) {
87 int x; // eliding var decl?
88 case 1:
89 x = 4;
90 break;
91 }
92}
93
94// CHECK: @test6
95// CHECK-NOT: switch
96// CHECK-NOT: @dead
97// CHECK: ret void
98void test6() {
99 // Neither case is reachable.
100 switch (40) {
101 case 1:
102 dead();
103 break;
104 case 4: {
105 dead();
106 break;
107 }
108 }
109}
110
111// CHECK: @test7
112// CHECK-NOT: switch
113// CHECK-NOT: @dead
114// CHECK: add nsw i32
115// CHECK-NOT: switch
116// CHECK-NOT: @dead
117// CHECK: ret void
118void test7() {
119 switch (4) {
120 case 1:
121 dead();
122 break;
123 {
124 case 4: // crazy brace scenario
125 ++i;
126 }
127 break;
128 }
129}
130
131// CHECK: @test8
132// CHECK-NOT: switch
133// CHECK-NOT: @dead
134// CHECK: add nsw i32
135// CHECK-NOT: switch
136// CHECK-NOT: @dead
137// CHECK: ret void
138void test8() {
139 switch (4) {
140 case 1:
141 dead();
142 break;
143 case 4:
144 ++i;
145 // Fall off the end of the switch.
146 }
147}
148
149// CHECK: @test9
150// CHECK-NOT: switch
151// CHECK-NOT: @dead
152// CHECK: add nsw i32
153// CHECK: add nsw i32
154// CHECK-NOT: switch
155// CHECK-NOT: @dead
156// CHECK: ret void
157void test9(int i) {
158 switch (1) {
159 case 5:
160 dead();
161 case 1:
162 ++i;
163 // Fall through is fine.
164 case 4:
165 ++i;
166 break;
167 }
168}
169