annotate clang/test/CodeGen/switch-dce.c @ 207:2e18cbf3894f

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