annotate clang/test/CodeGen/switch.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 -O3 %s -emit-llvm -o - | FileCheck %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 int foo(int i) {
anatofuz
parents:
diff changeset
4 int j = 0;
anatofuz
parents:
diff changeset
5 switch (i) {
anatofuz
parents:
diff changeset
6 case -1:
anatofuz
parents:
diff changeset
7 j = 1; break;
anatofuz
parents:
diff changeset
8 case 1 :
anatofuz
parents:
diff changeset
9 j = 2; break;
anatofuz
parents:
diff changeset
10 case 2:
anatofuz
parents:
diff changeset
11 j = 3; break;
anatofuz
parents:
diff changeset
12 default:
anatofuz
parents:
diff changeset
13 j = 42; break;
anatofuz
parents:
diff changeset
14 }
anatofuz
parents:
diff changeset
15 j = j + 1;
anatofuz
parents:
diff changeset
16 return j;
anatofuz
parents:
diff changeset
17 }
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 int foo2(int i) {
anatofuz
parents:
diff changeset
20 int j = 0;
anatofuz
parents:
diff changeset
21 switch (i) {
anatofuz
parents:
diff changeset
22 case 1 :
anatofuz
parents:
diff changeset
23 j = 2; break;
anatofuz
parents:
diff changeset
24 case 2 ... 10:
anatofuz
parents:
diff changeset
25 j = 3; break;
anatofuz
parents:
diff changeset
26 default:
anatofuz
parents:
diff changeset
27 j = 42; break;
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29 j = j + 1;
anatofuz
parents:
diff changeset
30 return j;
anatofuz
parents:
diff changeset
31 }
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 int foo3(int i) {
anatofuz
parents:
diff changeset
34 int j = 0;
anatofuz
parents:
diff changeset
35 switch (i) {
anatofuz
parents:
diff changeset
36 default:
anatofuz
parents:
diff changeset
37 j = 42; break;
anatofuz
parents:
diff changeset
38 case 111:
anatofuz
parents:
diff changeset
39 j = 111; break;
anatofuz
parents:
diff changeset
40 case 0 ... 100:
anatofuz
parents:
diff changeset
41 j = 1; break;
anatofuz
parents:
diff changeset
42 case 222:
anatofuz
parents:
diff changeset
43 j = 222; break;
anatofuz
parents:
diff changeset
44 }
anatofuz
parents:
diff changeset
45 return j;
anatofuz
parents:
diff changeset
46 }
anatofuz
parents:
diff changeset
47
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 static int foo4(int i) {
anatofuz
parents:
diff changeset
50 int j = 0;
anatofuz
parents:
diff changeset
51 switch (i) {
anatofuz
parents:
diff changeset
52 case 111:
anatofuz
parents:
diff changeset
53 j = 111; break;
anatofuz
parents:
diff changeset
54 case 0 ... 100:
anatofuz
parents:
diff changeset
55 j = 1; break;
anatofuz
parents:
diff changeset
56 case 222:
anatofuz
parents:
diff changeset
57 j = 222; break;
anatofuz
parents:
diff changeset
58 default:
anatofuz
parents:
diff changeset
59 j = 42; break;
anatofuz
parents:
diff changeset
60 case 501 ... 600:
anatofuz
parents:
diff changeset
61 j = 5; break;
anatofuz
parents:
diff changeset
62 }
anatofuz
parents:
diff changeset
63 return j;
anatofuz
parents:
diff changeset
64 }
anatofuz
parents:
diff changeset
65
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 // CHECK-LABEL: define{{.*}} i32 @foo4t()
150
anatofuz
parents:
diff changeset
67 // CHECK: ret i32 376
anatofuz
parents:
diff changeset
68 // CHECK: }
anatofuz
parents:
diff changeset
69 int foo4t() {
anatofuz
parents:
diff changeset
70 // 111 + 1 + 222 + 42 = 376
anatofuz
parents:
diff changeset
71 return foo4(111) + foo4(99) + foo4(222) + foo4(601);
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
74 // CHECK-LABEL: define{{.*}} void @foo5()
150
anatofuz
parents:
diff changeset
75 // CHECK-NOT: switch
anatofuz
parents:
diff changeset
76 // CHECK: }
anatofuz
parents:
diff changeset
77 void foo5(){
anatofuz
parents:
diff changeset
78 switch(0){
anatofuz
parents:
diff changeset
79 default:
anatofuz
parents:
diff changeset
80 if (0) {
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
86 // CHECK-LABEL: define{{.*}} void @foo6()
150
anatofuz
parents:
diff changeset
87 // CHECK-NOT: switch
anatofuz
parents:
diff changeset
88 // CHECK: }
anatofuz
parents:
diff changeset
89 void foo6(){
anatofuz
parents:
diff changeset
90 switch(0){
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
94 // CHECK-LABEL: define{{.*}} void @foo7()
150
anatofuz
parents:
diff changeset
95 // CHECK-NOT: switch
anatofuz
parents:
diff changeset
96 // CHECK: }
anatofuz
parents:
diff changeset
97 void foo7(){
anatofuz
parents:
diff changeset
98 switch(0){
anatofuz
parents:
diff changeset
99 foo7();
anatofuz
parents:
diff changeset
100 }
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
104 // CHECK-LABEL: define{{.*}} i32 @f8(
150
anatofuz
parents:
diff changeset
105 // CHECK: ret i32 3
anatofuz
parents:
diff changeset
106 // CHECK: }
anatofuz
parents:
diff changeset
107 int f8(unsigned x) {
anatofuz
parents:
diff changeset
108 switch(x) {
anatofuz
parents:
diff changeset
109 default:
anatofuz
parents:
diff changeset
110 return 3;
anatofuz
parents:
diff changeset
111 case 0xFFFFFFFF ... 1: // This range should be empty because x is unsigned.
anatofuz
parents:
diff changeset
112 return 0;
anatofuz
parents:
diff changeset
113 }
anatofuz
parents:
diff changeset
114 }
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 // Ensure that default after a case range is not ignored.
anatofuz
parents:
diff changeset
117 //
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
118 // CHECK-LABEL: define{{.*}} i32 @f9()
150
anatofuz
parents:
diff changeset
119 // CHECK: ret i32 10
anatofuz
parents:
diff changeset
120 // CHECK: }
anatofuz
parents:
diff changeset
121 static int f9_0(unsigned x) {
anatofuz
parents:
diff changeset
122 switch(x) {
anatofuz
parents:
diff changeset
123 case 10 ... 0xFFFFFFFF:
anatofuz
parents:
diff changeset
124 return 0;
anatofuz
parents:
diff changeset
125 default:
anatofuz
parents:
diff changeset
126 return 10;
anatofuz
parents:
diff changeset
127 }
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129 int f9() {
anatofuz
parents:
diff changeset
130 return f9_0(2);
anatofuz
parents:
diff changeset
131 }
anatofuz
parents:
diff changeset
132
anatofuz
parents:
diff changeset
133 // Ensure that this doesn't compile to infinite loop in g() due to
anatofuz
parents:
diff changeset
134 // miscompilation of fallthrough from default to a (tested) case
anatofuz
parents:
diff changeset
135 // range.
anatofuz
parents:
diff changeset
136 //
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
137 // CHECK-LABEL: define{{.*}} i32 @f10()
150
anatofuz
parents:
diff changeset
138 // CHECK: ret i32 10
anatofuz
parents:
diff changeset
139 // CHECK: }
anatofuz
parents:
diff changeset
140 static int f10_0(unsigned x) {
anatofuz
parents:
diff changeset
141 switch(x) {
anatofuz
parents:
diff changeset
142 default:
anatofuz
parents:
diff changeset
143 x += 1;
anatofuz
parents:
diff changeset
144 case 10 ... 0xFFFFFFFF:
anatofuz
parents:
diff changeset
145 return 0;
anatofuz
parents:
diff changeset
146 }
anatofuz
parents:
diff changeset
147 }
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 int f10() {
anatofuz
parents:
diff changeset
150 f10_0(1);
anatofuz
parents:
diff changeset
151 return 10;
anatofuz
parents:
diff changeset
152 }
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 // This generated incorrect code because of poor switch chaining.
anatofuz
parents:
diff changeset
155 //
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
156 // CHECK-LABEL: define{{.*}} i32 @f11(
150
anatofuz
parents:
diff changeset
157 // CHECK: ret i32 3
anatofuz
parents:
diff changeset
158 // CHECK: }
anatofuz
parents:
diff changeset
159 int f11(int x) {
anatofuz
parents:
diff changeset
160 switch(x) {
anatofuz
parents:
diff changeset
161 default:
anatofuz
parents:
diff changeset
162 return 3;
anatofuz
parents:
diff changeset
163 case 10 ... 0xFFFFFFFF:
anatofuz
parents:
diff changeset
164 return 0;
anatofuz
parents:
diff changeset
165 }
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168 // This just asserted because of the way case ranges were calculated.
anatofuz
parents:
diff changeset
169 //
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
170 // CHECK-LABEL: define{{.*}} i32 @f12(
150
anatofuz
parents:
diff changeset
171 // CHECK: ret i32 3
anatofuz
parents:
diff changeset
172 // CHECK: }
anatofuz
parents:
diff changeset
173 int f12(int x) {
anatofuz
parents:
diff changeset
174 switch (x) {
anatofuz
parents:
diff changeset
175 default:
anatofuz
parents:
diff changeset
176 return 3;
anatofuz
parents:
diff changeset
177 case 10 ... -1:
anatofuz
parents:
diff changeset
178 return 0;
anatofuz
parents:
diff changeset
179 }
anatofuz
parents:
diff changeset
180 }
anatofuz
parents:
diff changeset
181
anatofuz
parents:
diff changeset
182 // Make sure return is not constant (if empty range is skipped or miscompiled)
anatofuz
parents:
diff changeset
183 //
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
184 // CHECK-LABEL: define{{.*}} i32 @f13(
150
anatofuz
parents:
diff changeset
185 // CHECK: ret i32 %
anatofuz
parents:
diff changeset
186 // CHECK: }
anatofuz
parents:
diff changeset
187 int f13(unsigned x) {
anatofuz
parents:
diff changeset
188 switch(x) {
anatofuz
parents:
diff changeset
189 case 2:
anatofuz
parents:
diff changeset
190 // fallthrough empty range
anatofuz
parents:
diff changeset
191 case 10 ... 9:
anatofuz
parents:
diff changeset
192 return 10;
anatofuz
parents:
diff changeset
193 default:
anatofuz
parents:
diff changeset
194 return 0;
anatofuz
parents:
diff changeset
195 }
anatofuz
parents:
diff changeset
196 }
anatofuz
parents:
diff changeset
197
anatofuz
parents:
diff changeset
198 // Don't delete a basic block that we want to introduce later references to.
anatofuz
parents:
diff changeset
199 // This isn't really specific to switches, but it's easy to show with them.
anatofuz
parents:
diff changeset
200 // rdar://problem/8837067
anatofuz
parents:
diff changeset
201 int f14(int x) {
anatofuz
parents:
diff changeset
202 switch (x) {
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 // case range so that the case block has no predecessors
anatofuz
parents:
diff changeset
205 case 0 ... 15:
anatofuz
parents:
diff changeset
206 // any expression which doesn't introduce a new block
anatofuz
parents:
diff changeset
207 (void) 0;
anatofuz
parents:
diff changeset
208 // kaboom
anatofuz
parents:
diff changeset
209
anatofuz
parents:
diff changeset
210 default:
anatofuz
parents:
diff changeset
211 return x;
anatofuz
parents:
diff changeset
212 }
anatofuz
parents:
diff changeset
213 }