xref: /aosp_15_r20/external/clang/test/CodeGen/switch-dce.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // PR9322 and rdar://6970405
4*67e74705SXin Li 
5*67e74705SXin Li // CHECK: @test1
6*67e74705SXin Li // CHECK-NOT: switch
7*67e74705SXin Li // CHECK-NOT: @dead
8*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 1
9*67e74705SXin Li // CHECK-NOT: switch
10*67e74705SXin Li // CHECK-NOT: @dead
11*67e74705SXin Li // CHECK: ret void
12*67e74705SXin Li int i;
13*67e74705SXin Li void dead();
14*67e74705SXin Li 
test1()15*67e74705SXin Li void test1() {
16*67e74705SXin Li   switch (1)
17*67e74705SXin Li     case 1:
18*67e74705SXin Li       ++i;
19*67e74705SXin Li 
20*67e74705SXin Li   switch (0)
21*67e74705SXin Li     case 1:
22*67e74705SXin Li       dead();
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li 
26*67e74705SXin Li // CHECK: @test2
27*67e74705SXin Li // CHECK-NOT: switch
28*67e74705SXin Li // CHECK-NOT: @dead
29*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2
30*67e74705SXin Li // CHECK-NOT: switch
31*67e74705SXin Li // CHECK-NOT: @dead
32*67e74705SXin Li // CHECK: ret void
test2()33*67e74705SXin Li void test2() {
34*67e74705SXin Li   switch (4) {
35*67e74705SXin Li   case 1:
36*67e74705SXin Li     dead();
37*67e74705SXin Li     break;
38*67e74705SXin Li   case 4:
39*67e74705SXin Li     i += 2;
40*67e74705SXin Li     // Fall off the end of the switch.
41*67e74705SXin Li   }
42*67e74705SXin Li }
43*67e74705SXin Li 
44*67e74705SXin Li 
45*67e74705SXin Li // CHECK: @test3
46*67e74705SXin Li // CHECK-NOT: switch
47*67e74705SXin Li // CHECK-NOT: @dead
48*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2
49*67e74705SXin Li // CHECK-NOT: switch
50*67e74705SXin Li // CHECK-NOT: @dead
51*67e74705SXin Li // CHECK: ret void
test3()52*67e74705SXin Li void test3() {
53*67e74705SXin Li   switch (4) {
54*67e74705SXin Li   case 1:
55*67e74705SXin Li     dead();
56*67e74705SXin Li     break;
57*67e74705SXin Li   case 4: {
58*67e74705SXin Li     i += 2;
59*67e74705SXin Li     break;
60*67e74705SXin Li   }
61*67e74705SXin Li   }
62*67e74705SXin Li }
63*67e74705SXin Li 
64*67e74705SXin Li // CHECK: @test4
65*67e74705SXin Li // CHECK-NOT: switch
66*67e74705SXin Li // CHECK-NOT: @dead
67*67e74705SXin Li // CHECK: add nsw i32 {{.*}}, 2
68*67e74705SXin Li // CHECK-NOT: switch
69*67e74705SXin Li // CHECK-NOT: @dead
70*67e74705SXin Li // CHECK: ret void
test4()71*67e74705SXin Li void test4() {
72*67e74705SXin Li   switch (4) {
73*67e74705SXin Li     case 1:
74*67e74705SXin Li       dead();
75*67e74705SXin Li       break;
76*67e74705SXin Li     default: {
77*67e74705SXin Li       i += 2;
78*67e74705SXin Li       break;
79*67e74705SXin Li     }
80*67e74705SXin Li   }
81*67e74705SXin Li }
82*67e74705SXin Li 
83*67e74705SXin Li // This shouldn't crash codegen, but we don't have to optimize out the switch
84*67e74705SXin Li // in this case.
test5()85*67e74705SXin Li void test5() {
86*67e74705SXin Li   switch (1) {
87*67e74705SXin Li     int x;  // eliding var decl?
88*67e74705SXin Li     case 1:
89*67e74705SXin Li       x = 4;
90*67e74705SXin Li       i = x;
91*67e74705SXin Li       break;
92*67e74705SXin Li   }
93*67e74705SXin Li }
94*67e74705SXin Li 
95*67e74705SXin Li // CHECK: @test6
96*67e74705SXin Li // CHECK-NOT: switch
97*67e74705SXin Li // CHECK-NOT: @dead
98*67e74705SXin Li // CHECK: ret void
test6()99*67e74705SXin Li void test6() {
100*67e74705SXin Li   // Neither case is reachable.
101*67e74705SXin Li   switch (40) {
102*67e74705SXin Li   case 1:
103*67e74705SXin Li    dead();
104*67e74705SXin Li     break;
105*67e74705SXin Li   case 4: {
106*67e74705SXin Li     dead();
107*67e74705SXin Li     break;
108*67e74705SXin Li   }
109*67e74705SXin Li   }
110*67e74705SXin Li }
111*67e74705SXin Li 
112*67e74705SXin Li // CHECK: @test7
113*67e74705SXin Li // CHECK-NOT: switch
114*67e74705SXin Li // CHECK-NOT: @dead
115*67e74705SXin Li // CHECK: add nsw i32
116*67e74705SXin Li // CHECK-NOT: switch
117*67e74705SXin Li // CHECK-NOT: @dead
118*67e74705SXin Li // CHECK: ret void
test7()119*67e74705SXin Li void test7() {
120*67e74705SXin Li   switch (4) {
121*67e74705SXin Li   case 1:
122*67e74705SXin Li       dead();
123*67e74705SXin Li     break;
124*67e74705SXin Li     {
125*67e74705SXin Li       case 4:   // crazy brace scenario
126*67e74705SXin Li         ++i;
127*67e74705SXin Li     }
128*67e74705SXin Li     break;
129*67e74705SXin Li   }
130*67e74705SXin Li }
131*67e74705SXin Li 
132*67e74705SXin Li // CHECK: @test8
133*67e74705SXin Li // CHECK-NOT: switch
134*67e74705SXin Li // CHECK-NOT: @dead
135*67e74705SXin Li // CHECK: add nsw i32
136*67e74705SXin Li // CHECK-NOT: switch
137*67e74705SXin Li // CHECK-NOT: @dead
138*67e74705SXin Li // CHECK: ret void
test8()139*67e74705SXin Li void test8() {
140*67e74705SXin Li   switch (4) {
141*67e74705SXin Li   case 1:
142*67e74705SXin Li     dead();
143*67e74705SXin Li     break;
144*67e74705SXin Li   case 4:
145*67e74705SXin Li     ++i;
146*67e74705SXin Li     // Fall off the end of the switch.
147*67e74705SXin Li   }
148*67e74705SXin Li }
149*67e74705SXin Li 
150*67e74705SXin Li // CHECK: @test9
151*67e74705SXin Li // CHECK-NOT: switch
152*67e74705SXin Li // CHECK-NOT: @dead
153*67e74705SXin Li // CHECK: add nsw i32
154*67e74705SXin Li // CHECK: add nsw i32
155*67e74705SXin Li // CHECK-NOT: switch
156*67e74705SXin Li // CHECK-NOT: @dead
157*67e74705SXin Li // CHECK: ret void
test9(int i)158*67e74705SXin Li void test9(int i) {
159*67e74705SXin Li   switch (1) {
160*67e74705SXin Li   case 5:
161*67e74705SXin Li     dead();
162*67e74705SXin Li   case 1:
163*67e74705SXin Li     ++i;
164*67e74705SXin Li     // Fall through is fine.
165*67e74705SXin Li   case 4:
166*67e74705SXin Li     ++i;
167*67e74705SXin Li     break;
168*67e74705SXin Li   }
169*67e74705SXin Li }
170*67e74705SXin Li 
171*67e74705SXin Li // CHECK: @test10
172*67e74705SXin Li // CHECK-NOT: switch
173*67e74705SXin Li // CHECK: ret i32
test10(void)174*67e74705SXin Li int test10(void) {
175*67e74705SXin Li 	switch(8) {
176*67e74705SXin Li 		case 8:
177*67e74705SXin Li 			break;
178*67e74705SXin Li 		case 4:
179*67e74705SXin Li 			break;
180*67e74705SXin Li 		default:
181*67e74705SXin Li 			dead();
182*67e74705SXin Li 	}
183*67e74705SXin Li 
184*67e74705SXin Li 	return 0;
185*67e74705SXin Li }
186*67e74705SXin Li 
187*67e74705SXin Li // CHECK: @test11
188*67e74705SXin Li // CHECK-NOT: switch
189*67e74705SXin Li // CHECK: ret void
test11()190*67e74705SXin Li void test11() {
191*67e74705SXin Li   switch (1) {
192*67e74705SXin Li     case 1:
193*67e74705SXin Li       break;
194*67e74705SXin Li     case 42: ;
195*67e74705SXin Li       int x;  // eliding var decl?
196*67e74705SXin Li       x = 4;
197*67e74705SXin Li       break;
198*67e74705SXin Li   }
199*67e74705SXin Li }
200*67e74705SXin Li 
201*67e74705SXin Li // CHECK: @test12
202*67e74705SXin Li // CHECK-NOT: switch
203*67e74705SXin Li // CHECK: ret void
test12()204*67e74705SXin Li void test12() {
205*67e74705SXin Li   switch (1) {
206*67e74705SXin Li   case 2: {
207*67e74705SXin Li      int a;   // Ok to skip this vardecl.
208*67e74705SXin Li      a = 42;
209*67e74705SXin Li    }
210*67e74705SXin Li   case 1:
211*67e74705SXin Li     break;
212*67e74705SXin Li   case 42: ;
213*67e74705SXin Li     int x;  // eliding var decl?
214*67e74705SXin Li     x = 4;
215*67e74705SXin Li     break;
216*67e74705SXin Li   }
217*67e74705SXin Li }
218*67e74705SXin Li 
219*67e74705SXin Li // Verify that case 42 only calls test14 once.
220*67e74705SXin Li // CHECK: @test13
221*67e74705SXin Li // CHECK: call void @test13(i32 97)
222*67e74705SXin Li // CHECK-NEXT: br label %[[EPILOG2:[0-9.a-z]+]]
223*67e74705SXin Li // CHECK: [[EPILOG2]]
224*67e74705SXin Li // CHECK-NEXT: br label [[EPILOG:%[0-9.a-z]+]]
225*67e74705SXin Li // CHECK: call void @test13(i32 42)
226*67e74705SXin Li // CHECK-NEXT: br label [[EPILOG]]
test13(int x)227*67e74705SXin Li void test13(int x) {
228*67e74705SXin Li   switch (x) {
229*67e74705SXin Li     case 42: test13(97);  // fallthrough
230*67e74705SXin Li     case 11: break;
231*67e74705SXin Li     default: test13(42); break;
232*67e74705SXin Li   }
233*67e74705SXin Li }
234*67e74705SXin Li 
235