• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2 
3 // PR9322 and rdar://6970405
4 
5 // CHECK: @test1
6 // CHECK-NOT: switch
7 // CHECK-NOT: @dead
8 // CHECK: add nsw i32 {{.*}}, 1
9 // CHECK-NOT: switch
10 // CHECK-NOT: @dead
11 // CHECK: ret void
12 int i;
13 void dead();
14 
test1()15 void test1() {
16   switch (1)
17     case 1:
18       ++i;
19 
20   switch (0)
21     case 1:
22       dead();
23 }
24 
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
test2()33 void 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
test3()52 void 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
test4()71 void 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.
test5()85 void test5() {
86   switch (1) {
87     int x;  // eliding var decl?
88     case 1:
89       x = 4;
90       i = x;
91       break;
92   }
93 }
94 
95 // CHECK: @test6
96 // CHECK-NOT: switch
97 // CHECK-NOT: @dead
98 // CHECK: ret void
test6()99 void test6() {
100   // Neither case is reachable.
101   switch (40) {
102   case 1:
103    dead();
104     break;
105   case 4: {
106     dead();
107     break;
108   }
109   }
110 }
111 
112 // CHECK: @test7
113 // CHECK-NOT: switch
114 // CHECK-NOT: @dead
115 // CHECK: add nsw i32
116 // CHECK-NOT: switch
117 // CHECK-NOT: @dead
118 // CHECK: ret void
test7()119 void test7() {
120   switch (4) {
121   case 1:
122       dead();
123     break;
124     {
125       case 4:   // crazy brace scenario
126         ++i;
127     }
128     break;
129   }
130 }
131 
132 // CHECK: @test8
133 // CHECK-NOT: switch
134 // CHECK-NOT: @dead
135 // CHECK: add nsw i32
136 // CHECK-NOT: switch
137 // CHECK-NOT: @dead
138 // CHECK: ret void
test8()139 void test8() {
140   switch (4) {
141   case 1:
142     dead();
143     break;
144   case 4:
145     ++i;
146     // Fall off the end of the switch.
147   }
148 }
149 
150 // CHECK: @test9
151 // CHECK-NOT: switch
152 // CHECK-NOT: @dead
153 // CHECK: add nsw i32
154 // CHECK: add nsw i32
155 // CHECK-NOT: switch
156 // CHECK-NOT: @dead
157 // CHECK: ret void
test9(int i)158 void test9(int i) {
159   switch (1) {
160   case 5:
161     dead();
162   case 1:
163     ++i;
164     // Fall through is fine.
165   case 4:
166     ++i;
167     break;
168   }
169 }
170 
171 // CHECK: @test10
172 // CHECK-NOT: switch
173 // CHECK: ret i32
test10(void)174 int test10(void) {
175 	switch(8) {
176 		case 8:
177 			break;
178 		case 4:
179 			break;
180 		default:
181 			dead();
182 	}
183 
184 	return 0;
185 }
186 
187 // CHECK: @test11
188 // CHECK-NOT: switch
189 // CHECK: ret void
test11()190 void test11() {
191   switch (1) {
192     case 1:
193       break;
194     case 42: ;
195       int x;  // eliding var decl?
196       x = 4;
197       break;
198   }
199 }
200 
201 // CHECK: @test12
202 // CHECK-NOT: switch
203 // CHECK: ret void
test12()204 void test12() {
205   switch (1) {
206   case 2: {
207      int a;   // Ok to skip this vardecl.
208      a = 42;
209    }
210   case 1:
211     break;
212   case 42: ;
213     int x;  // eliding var decl?
214     x = 4;
215     break;
216   }
217 }
218 
219 // Verify that case 42 only calls test14 once.
220 // CHECK: @test13
221 // CHECK: call void @test13(i32 97)
222 // CHECK-NEXT: br label %[[EPILOG2:[0-9.a-z]+]]
223 // CHECK: [[EPILOG2]]
224 // CHECK-NEXT: br label [[EPILOG:%[0-9.a-z]+]]
225 // CHECK: call void @test13(i32 42)
226 // CHECK-NEXT: br label [[EPILOG]]
test13(int x)227 void test13(int x) {
228   switch (x) {
229     case 42: test13(97);  // fallthrough
230     case 11: break;
231     default: test13(42); break;
232   }
233 }
234 
235