OLD | NEW |
---|---|
(Empty) | |
1 ; Test switch instructions. | |
2 | |
3 ; RUN: llvm-as < %s | pnacl-freeze -allow-local-symbol-tables \ | |
4 ; RUN: | %llvm2ice -notranslate -verbose=inst -build-on-read \ | |
5 ; RUN: -allow-pnacl-reader-error-recovery \ | |
6 ; RUN: -allow-local-symbol-tables \ | |
7 ; RUN: | FileCheck %s | |
8 | |
9 define i32 @testSwitch(i32 %a) { | |
Jim Stichnoth
2014/09/17 20:18:20
I think it wouldn't hurt to have a test where ther
Karl
2014/09/17 22:07:19
Done.
| |
10 entry: | |
11 switch i32 %a, label %sw.default [ | |
12 i32 1, label %sw.epilog | |
13 i32 2, label %sw.epilog | |
14 i32 3, label %sw.epilog | |
15 i32 7, label %sw.bb1 | |
16 i32 8, label %sw.bb1 | |
17 i32 15, label %sw.bb2 | |
18 i32 14, label %sw.bb2 | |
19 ] | |
20 | |
21 sw.default: ; preds = %entry | |
22 %add = add i32 %a, 27 | |
23 br label %sw.epilog | |
24 | |
25 sw.bb1: ; preds = %entry, %entry | |
26 %phitmp = sub i32 21, %a | |
27 br label %sw.bb2 | |
28 | |
29 sw.bb2: ; preds = %sw.bb1, %entry, %en try | |
30 %result.0 = phi i32 [ 1, %entry ], [ 1, %entry ], [ %phitmp, %sw.bb1 ] | |
31 br label %sw.epilog | |
32 | |
33 sw.epilog: ; preds = %sw.bb2, %sw.default , %entry, %entry, %entry | |
34 %result.1 = phi i32 [ %add, %sw.default ], [ %result.0, %sw.bb2 ], [ 17, %entr y ], [ 17, %entry ], [ 17, %entry ] | |
35 ret i32 %result.1 | |
36 } | |
37 | |
38 ; CHECK: define i32 @testSwitch(i32 %a) { | |
39 ; CHECK-NEXT: entry: | |
40 ; CHECK-NEXT: switch i32 %a, label %sw.default [ | |
41 ; CHECK-NEXT: i32 1, label %sw.epilog | |
42 ; CHECK-NEXT: i32 2, label %sw.epilog | |
43 ; CHECK-NEXT: i32 3, label %sw.epilog | |
44 ; CHECK-NEXT: i32 7, label %sw.bb1 | |
45 ; CHECK-NEXT: i32 8, label %sw.bb1 | |
46 ; CHECK-NEXT: i32 15, label %sw.bb2 | |
47 ; CHECK-NEXT: i32 14, label %sw.bb2 | |
48 ; CHECK-NEXT: ] | |
49 ; CHECK-NEXT: sw.default: | |
50 ; CHECK-NEXT: %add = add i32 %a, 27 | |
51 ; CHECK-NEXT: br label %sw.epilog | |
52 ; CHECK-NEXT: sw.bb1: | |
53 ; CHECK-NEXT: %phitmp = sub i32 21, %a | |
54 ; CHECK-NEXT: br label %sw.bb2 | |
55 ; CHECK-NEXT: sw.bb2: | |
56 ; CHECK-NEXT: %result.0 = phi i32 [ 1, %entry ], [ 1, %entry ], [ %phitmp, %sw .bb1 ] | |
57 ; CHECK-NEXT: br label %sw.epilog | |
58 ; CHECK-NEXT: sw.epilog: | |
59 ; CHECK-NEXT: %result.1 = phi i32 [ %add, %sw.default ], [ %result.0, %sw.bb2 ], [ 17, %entry ], [ 17, %entry ], [ 17, %entry ] | |
60 ; CHECK-NEXT: ret i32 %result.1 | |
61 ; CHECK-NEXT: } | |
62 | |
63 define void @testSignedI32Values(i32 %a) { | |
Jim Stichnoth
2014/09/17 20:18:20
Add tests for i64 as well.
Karl
2014/09/17 22:07:19
Done.
| |
64 entry: | |
65 switch i32 %a, label %labelDefault [ | |
66 i32 0, label %label0 | |
67 i32 -1, label %labelM1 | |
68 i32 3, label %labelOther | |
69 i32 -3, label %labelOther | |
70 i32 -2147483648, label %labelMin ; min signed i32 | |
71 i32 2147483647, label %labelMax ; max signed i32 | |
72 ] | |
73 labelDefault: | |
74 ret void | |
75 label0: | |
76 ret void | |
77 labelM1: | |
78 ret void | |
79 labelMin: | |
80 ret void | |
81 labelMax: | |
82 ret void | |
83 labelOther: | |
84 ret void | |
85 } | |
86 ; CHECK-NEXT: define void @testSignedI32Values(i32 %a) { | |
87 ; CHECK-NEXT: entry: | |
88 ; CHECK-NEXT: switch i32 %a, label %labelDefault [ | |
89 ; CHECK-NEXT: i32 0, label %label0 | |
90 ; CHECK-NEXT: i32 -1, label %labelM1 | |
91 ; CHECK-NEXT: i32 3, label %labelOther | |
92 ; CHECK-NEXT: i32 -3, label %labelOther | |
93 ; CHECK-NEXT: i32 -2147483648, label %labelMin | |
94 ; CHECK-NEXT: i32 2147483647, label %labelMax | |
95 ; CHECK-NEXT: ] | |
96 ; CHECK-NEXT: labelDefault: | |
97 ; CHECK-NEXT: ret void | |
98 ; CHECK-NEXT: label0: | |
99 ; CHECK-NEXT: ret void | |
100 ; CHECK-NEXT: labelM1: | |
101 ; CHECK-NEXT: ret void | |
102 ; CHECK-NEXT: labelMin: | |
103 ; CHECK-NEXT: ret void | |
104 ; CHECK-NEXT: labelMax: | |
105 ; CHECK-NEXT: ret void | |
106 ; CHECK-NEXT: labelOther: | |
107 ; CHECK-NEXT: ret void | |
108 ; CHECK-NEXT: } | |
109 | |
110 define void @testUnsignedI32Values(i32 %a) { | |
111 entry: | |
112 switch i32 %a, label %exit [ | |
113 i32 0, label %exit | |
114 i32 2147483647, label %exit ; max signed i32 | |
Jim Stichnoth
2014/09/17 20:18:20
For this and the I16 and I8 unsigned tests (and th
Karl
2014/09/17 22:07:19
Done.
| |
115 i32 4294967295, label %exit ; max unsigned i32 | |
116 ] | |
117 exit: | |
118 ret void | |
119 } | |
120 | |
121 ; CHECK-NEXT: define void @testUnsignedI32Values(i32 %a) { | |
122 ; CHECK-NEXT: entry: | |
123 ; CHECK-NEXT: switch i32 %a, label %exit [ | |
124 ; CHECK-NEXT: i32 0, label %exit | |
125 ; CHECK-NEXT: i32 2147483647, label %exit | |
126 ; ; Note that -1 is signed version of 4294967295 | |
127 ; CHECK-NEXT: i32 -1, label %exit | |
128 ; CHECK-NEXT: ] | |
129 ; CHECK-NEXT: exit: | |
130 ; CHECK-NEXT: ret void | |
131 ; CHECK-NEXT: } | |
132 | |
133 define void @testSignedI16Values(i32 %p) { | |
134 entry: | |
135 %a = trunc i32 %p to i16 | |
136 switch i16 %a, label %exit [ | |
137 i16 0, label %exit | |
138 i16 -1, label %exit | |
139 i16 3, label %exit | |
140 i16 -3, label %exit | |
141 i16 -32768, label %exit ; min signed i16 | |
142 i16 32767, label %exit ; max unsigned i16 | |
143 ] | |
144 exit: | |
145 ret void | |
146 } | |
147 | |
148 ; CHECK-NEXT: define void @testSignedI16Values(i32 %p) { | |
149 ; CHECK-NEXT: entry: | |
150 ; CHECK-NEXT: %a = trunc i32 %p to i16 | |
151 ; CHECK-NEXT: switch i16 %a, label %exit [ | |
152 ; CHECK-NEXT: i16 0, label %exit | |
153 ; CHECK-NEXT: i16 -1, label %exit | |
154 ; CHECK-NEXT: i16 3, label %exit | |
155 ; CHECK-NEXT: i16 -3, label %exit | |
156 ; CHECK-NEXT: i16 -32768, label %exit | |
157 ; CHECK-NEXT: i16 32767, label %exit | |
158 ; CHECK-NEXT: ] | |
159 ; CHECK-NEXT: exit: | |
160 ; CHECK-NEXT: ret void | |
161 ; CHECK-NEXT: } | |
162 | |
163 define void @testUnsignedI16Values(i32 %p) { | |
164 entry: | |
165 %a = trunc i32 %p to i16 | |
166 switch i16 %a, label %exit [ | |
167 i16 0, label %exit | |
168 i16 32767, label %exit ; max signed i16 | |
169 i16 65535, label %exit ; max unsigned i16 | |
170 ] | |
171 exit: | |
172 ret void | |
173 } | |
174 | |
175 ; CHECK-NEXT: define void @testUnsignedI16Values(i32 %p) { | |
176 ; CHECK-NEXT: entry: | |
177 ; CHECK-NEXT: %a = trunc i32 %p to i16 | |
178 ; CHECK-NEXT: switch i16 %a, label %exit [ | |
179 ; CHECK-NEXT: i16 0, label %exit | |
180 ; CHECK-NEXT: i16 32767, label %exit | |
181 ; ; Note that -1 is signed version of 65535 | |
182 ; CHECK-NEXT: i16 -1, label %exit | |
183 ; CHECK-NEXT: ] | |
184 ; CHECK-NEXT: exit: | |
185 ; CHECK-NEXT: ret void | |
186 ; CHECK-NEXT: } | |
187 | |
188 define void @testSignedI8Values(i32 %p) { | |
189 entry: | |
190 %a = trunc i32 %p to i8 | |
191 switch i8 %a, label %exit [ | |
192 i8 0, label %exit | |
193 i8 -1, label %exit | |
194 i8 3, label %exit | |
195 i8 -3, label %exit | |
196 i8 -128, label %exit ; min signed i8 | |
197 i8 127, label %exit ; max unsigned i8 | |
198 ] | |
199 exit: | |
200 ret void | |
201 } | |
202 | |
203 ; CHECK-NEXT: define void @testSignedI8Values(i32 %p) { | |
204 ; CHECK-NEXT: entry: | |
205 ; CHECK-NEXT: %a = trunc i32 %p to i8 | |
206 ; CHECK-NEXT: switch i8 %a, label %exit [ | |
207 ; CHECK-NEXT: i8 0, label %exit | |
208 ; CHECK-NEXT: i8 -1, label %exit | |
209 ; CHECK-NEXT: i8 3, label %exit | |
210 ; CHECK-NEXT: i8 -3, label %exit | |
211 ; CHECK-NEXT: i8 -128, label %exit | |
212 ; CHECK-NEXT: i8 127, label %exit | |
213 ; CHECK-NEXT: ] | |
214 ; CHECK-NEXT: exit: | |
215 ; CHECK-NEXT: ret void | |
216 ; CHECK-NEXT: } | |
217 | |
218 define void @testUnsignedI8Values(i32 %p) { | |
219 entry: | |
220 %a = trunc i32 %p to i8 | |
221 switch i8 %a, label %exit [ | |
222 i8 0, label %exit | |
223 i8 127, label %exit ; max signed i8 | |
224 i8 255, label %exit ; max unsigned i8 | |
225 ] | |
226 exit: | |
227 ret void | |
228 } | |
229 | |
230 ; CHECK-NEXT: define void @testUnsignedI8Values(i32 %p) { | |
231 ; CHECK-NEXT: entry: | |
232 ; CHECK-NEXT: %a = trunc i32 %p to i8 | |
233 ; CHECK-NEXT: switch i8 %a, label %exit [ | |
234 ; CHECK-NEXT: i8 0, label %exit | |
235 ; CHECK-NEXT: i8 127, label %exit | |
236 ; ; Note that -1 is signed version of 255 | |
237 ; CHECK-NEXT: i8 -1, label %exit | |
238 ; CHECK-NEXT: ] | |
239 ; CHECK-NEXT: exit: | |
240 ; CHECK-NEXT: ret void | |
241 ; CHECK-NEXT: } | |
242 | |
243 define void @testI1Values(i32 %p) { | |
244 entry: | |
245 %a = trunc i32 %p to i1 | |
246 switch i1 %a, label %exit [ | |
247 i1 true, label %exit | |
248 i1 false, label %exit | |
249 ] | |
250 exit: | |
251 ret void | |
252 } | |
253 | |
254 ; CHECK-NEXT: define void @testI1Values(i32 %p) { | |
255 ; CHECK-NEXT: entry: | |
256 ; CHECK-NEXT: %a = trunc i32 %p to i1 | |
257 ; CHECK-NEXT: switch i1 %a, label %exit [ | |
258 ; CHECK-NEXT: i1 -1, label %exit | |
259 ; CHECK-NEXT: i1 0, label %exit | |
260 ; CHECK-NEXT: ] | |
261 ; CHECK-NEXT: exit: | |
262 ; CHECK-NEXT: ret void | |
263 ; CHECK-NEXT: } | |
OLD | NEW |