[test] Pre-commit llvm.experimental.memset.pattern tests prior to MemoryLocation...
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / X86 / switch_to_lookup_table_big.ll
blob4ebf09ae3b127012d482c70794d05a32063975cc
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
2 ; RUN: opt < %s -passes=simplifycfg -switch-to-lookup=true -S | FileCheck %s
3 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
4 target triple = "i386-pc-linux-gnu"
6 ; A dense switch with a reachable default case should be optimized into a lookup table with a bounds check
7 ;.
8 ; CHECK: @switch.table.reachable_default_dense_0to31 = private unnamed_addr constant [32 x i32] [i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1], align 4
9 ; CHECK: @switch.table.unreachable_default_dense_0to31 = private unnamed_addr constant [32 x i32] [i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1], align 4
10 ; CHECK: @switch.table.reachable_default_holes_0to31 = private unnamed_addr constant [32 x i32] [i32 0, i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 poison, i32 7, i32 6, i32 5, i32 4, i32 poison, i32 2, i32 1, i32 0, i32 7, i32 poison, i32 5, i32 4, i32 3, i32 2, i32 poison, i32 0, i32 7, i32 6, i32 5, i32 poison, i32 3, i32 2, i32 1], align 4
11 ; CHECK: @switch.table.unreachable_default_holes_0to31 = private unnamed_addr constant [32 x i32] [i32 0, i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 poison, i32 7, i32 6, i32 5, i32 4, i32 poison, i32 2, i32 1, i32 0, i32 7, i32 poison, i32 5, i32 4, i32 3, i32 2, i32 poison, i32 0, i32 7, i32 6, i32 5, i32 poison, i32 3, i32 2, i32 1], align 4
12 ; CHECK: @switch.table.reachable_default_dense_0to32 = private unnamed_addr constant [33 x i32] [i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0], align 4
13 ; CHECK: @switch.table.unreachable_default_dense_0to32 = private unnamed_addr constant [33 x i32] [i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0], align 4
14 ; CHECK: @switch.table.unreachable_default_holes_0to32 = private unnamed_addr constant [33 x i32] [i32 0, i32 7, i32 6, i32 poison, i32 4, i32 3, i32 2, i32 1, i32 poison, i32 7, i32 6, i32 5, i32 4, i32 poison, i32 2, i32 1, i32 0, i32 7, i32 poison, i32 5, i32 4, i32 3, i32 2, i32 poison, i32 0, i32 7, i32 6, i32 5, i32 poison, i32 3, i32 2, i32 1, i32 0], align 4
16 define i32 @reachable_default_dense_0to31(i32 %x, i32 %y) {
17 ; CHECK-LABEL: @reachable_default_dense_0to31(
18 ; CHECK-NEXT:  entry:
19 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[X:%.*]], 32
20 ; CHECK-NEXT:    br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
21 ; CHECK:       switch.lookup:
22 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.reachable_default_dense_0to31, i32 0, i32 [[X]]
23 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
24 ; CHECK-NEXT:    br label [[RETURN]]
25 ; CHECK:       return:
26 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ]
27 ; CHECK-NEXT:    ret i32 [[RES]]
29 entry:
30   switch i32 %x, label %sw.default [
31   i32 0, label %bb0
32   i32 1, label %bb7
33   i32 2, label %bb6
34   i32 3, label %bb5
35   i32 4, label %bb4
36   i32 5, label %bb3
37   i32 6, label %bb2
38   i32 7, label %bb1
39   i32 8, label %bb0
40   i32 9, label %bb7
41   i32 10, label %bb6
42   i32 11, label %bb5
43   i32 12, label %bb4
44   i32 13, label %bb3
45   i32 14, label %bb2
46   i32 15, label %bb1
47   i32 16, label %bb0
48   i32 17, label %bb7
49   i32 18, label %bb6
50   i32 19, label %bb5
51   i32 20, label %bb4
52   i32 21, label %bb3
53   i32 22, label %bb2
54   i32 23, label %bb1
55   i32 24, label %bb0
56   i32 25, label %bb7
57   i32 26, label %bb6
58   i32 27, label %bb5
59   i32 28, label %bb4
60   i32 29, label %bb3
61   i32 30, label %bb2
62   i32 31, label %bb1
63   ]
65 sw.default: br label %return
66 bb0: br label %return
67 bb1: br label %return
68 bb2: br label %return
69 bb3: br label %return
70 bb4: br label %return
71 bb5: br label %return
72 bb6: br label %return
73 bb7: br label %return
75 return:
76   %res = phi i32 [ %y, %sw.default ], [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
77   ret i32 %res
81 ; A dense switch with an unreachable default case should be optimized into a lookup table without bounds checks
82 define i32 @unreachable_default_dense_0to31(i32 %x, i32 %y) {
83 ; CHECK-LABEL: @unreachable_default_dense_0to31(
84 ; CHECK-NEXT:  entry:
85 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.unreachable_default_dense_0to31, i32 0, i32 [[X:%.*]]
86 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
87 ; CHECK-NEXT:    ret i32 [[SWITCH_LOAD]]
89 entry:
90   switch i32 %x, label %sw.default [
91   i32 0, label %bb0
92   i32 1, label %bb7
93   i32 2, label %bb6
94   i32 3, label %bb5
95   i32 4, label %bb4
96   i32 5, label %bb3
97   i32 6, label %bb2
98   i32 7, label %bb1
99   i32 8, label %bb0
100   i32 9, label %bb7
101   i32 10, label %bb6
102   i32 11, label %bb5
103   i32 12, label %bb4
104   i32 13, label %bb3
105   i32 14, label %bb2
106   i32 15, label %bb1
107   i32 16, label %bb0
108   i32 17, label %bb7
109   i32 18, label %bb6
110   i32 19, label %bb5
111   i32 20, label %bb4
112   i32 21, label %bb3
113   i32 22, label %bb2
114   i32 23, label %bb1
115   i32 24, label %bb0
116   i32 25, label %bb7
117   i32 26, label %bb6
118   i32 27, label %bb5
119   i32 28, label %bb4
120   i32 29, label %bb3
121   i32 30, label %bb2
122   i32 31, label %bb1
123   ]
125 sw.default: unreachable
126 bb0: br label %return
127 bb1: br label %return
128 bb2: br label %return
129 bb3: br label %return
130 bb4: br label %return
131 bb5: br label %return
132 bb6: br label %return
133 bb7: br label %return
135 return:
136   %res = phi i32 [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
137   ret i32 %res
141 ; A sparse switch with a reachable default case should be optimized into a lookup table with a bounds check and a mask
142 define i32 @reachable_default_holes_0to31(i32 %x, i32 %y) {
143 ; CHECK-LABEL: @reachable_default_holes_0to31(
144 ; CHECK-NEXT:  entry:
145 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[X:%.*]], 32
146 ; CHECK-NEXT:    br i1 [[TMP0]], label [[SWITCH_HOLE_CHECK:%.*]], label [[RETURN:%.*]]
147 ; CHECK:       switch.hole_check:
148 ; CHECK-NEXT:    [[SWITCH_SHIFTED:%.*]] = lshr i32 -277094665, [[X]]
149 ; CHECK-NEXT:    [[SWITCH_LOBIT:%.*]] = trunc i32 [[SWITCH_SHIFTED]] to i1
150 ; CHECK-NEXT:    br i1 [[SWITCH_LOBIT]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN]]
151 ; CHECK:       switch.lookup:
152 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.reachable_default_holes_0to31, i32 0, i32 [[X]]
153 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
154 ; CHECK-NEXT:    br label [[RETURN]]
155 ; CHECK:       return:
156 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ [[Y:%.*]], [[SWITCH_HOLE_CHECK]] ], [ [[Y]], [[ENTRY:%.*]] ]
157 ; CHECK-NEXT:    ret i32 [[RES]]
159 entry:
160   switch i32 %x, label %sw.default [
161   i32 0, label %bb0
162   i32 1, label %bb7
163   i32 2, label %bb6
164   i32 4, label %bb4
165   i32 5, label %bb3
166   i32 6, label %bb2
167   i32 7, label %bb1
168   i32 9, label %bb7
169   i32 10, label %bb6
170   i32 11, label %bb5
171   i32 12, label %bb4
172   i32 14, label %bb2
173   i32 15, label %bb1
174   i32 16, label %bb0
175   i32 17, label %bb7
176   i32 19, label %bb5
177   i32 20, label %bb4
178   i32 21, label %bb3
179   i32 22, label %bb2
180   i32 24, label %bb0
181   i32 25, label %bb7
182   i32 26, label %bb6
183   i32 27, label %bb5
184   i32 29, label %bb3
185   i32 30, label %bb2
186   i32 31, label %bb1
187   ]
189 sw.default: br label %return
190 bb0: br label %return
191 bb1: br label %return
192 bb2: br label %return
193 bb3: br label %return
194 bb4: br label %return
195 bb5: br label %return
196 bb6: br label %return
197 bb7: br label %return
199 return:
200   %res = phi i32 [ %y, %sw.default ], [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
201   ret i32 %res
205 ; A sparse switch with an unreachable default case should be optimized into a lookup table without bounds checks
206 define i32 @unreachable_default_holes_0to31(i32 %x, i32 %y) {
207 ; CHECK-LABEL: @unreachable_default_holes_0to31(
208 ; CHECK-NEXT:  entry:
209 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.unreachable_default_holes_0to31, i32 0, i32 [[X:%.*]]
210 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
211 ; CHECK-NEXT:    ret i32 [[SWITCH_LOAD]]
213 entry:
214   switch i32 %x, label %sw.default [
215   i32 0, label %bb0
216   i32 1, label %bb7
217   i32 2, label %bb6
218   i32 4, label %bb4
219   i32 5, label %bb3
220   i32 6, label %bb2
221   i32 7, label %bb1
222   i32 9, label %bb7
223   i32 10, label %bb6
224   i32 11, label %bb5
225   i32 12, label %bb4
226   i32 14, label %bb2
227   i32 15, label %bb1
228   i32 16, label %bb0
229   i32 17, label %bb7
230   i32 19, label %bb5
231   i32 20, label %bb4
232   i32 21, label %bb3
233   i32 22, label %bb2
234   i32 24, label %bb0
235   i32 25, label %bb7
236   i32 26, label %bb6
237   i32 27, label %bb5
238   i32 29, label %bb3
239   i32 30, label %bb2
240   i32 31, label %bb1
241   ]
243 sw.default: unreachable
244 bb0: br label %return
245 bb1: br label %return
246 bb2: br label %return
247 bb3: br label %return
248 bb4: br label %return
249 bb5: br label %return
250 bb6: br label %return
251 bb7: br label %return
253 return:
254   %res = phi i32 [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
255   ret i32 %res
259 ; A dense switch with a reachable default case should be optimized into a lookup table with a bounds check
260 define i32 @reachable_default_dense_0to32(i32 %x, i32 %y) {
261 ; CHECK-LABEL: @reachable_default_dense_0to32(
262 ; CHECK-NEXT:  entry:
263 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp ult i32 [[X:%.*]], 33
264 ; CHECK-NEXT:    br i1 [[TMP0]], label [[SWITCH_LOOKUP:%.*]], label [[RETURN:%.*]]
265 ; CHECK:       switch.lookup:
266 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [33 x i32], ptr @switch.table.reachable_default_dense_0to32, i32 0, i32 [[X]]
267 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
268 ; CHECK-NEXT:    br label [[RETURN]]
269 ; CHECK:       return:
270 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ [[SWITCH_LOAD]], [[SWITCH_LOOKUP]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ]
271 ; CHECK-NEXT:    ret i32 [[RES]]
273 entry:
274   switch i32 %x, label %sw.default [
275   i32 0, label %bb0
276   i32 1, label %bb7
277   i32 2, label %bb6
278   i32 3, label %bb5
279   i32 4, label %bb4
280   i32 5, label %bb3
281   i32 6, label %bb2
282   i32 7, label %bb1
283   i32 8, label %bb0
284   i32 9, label %bb7
285   i32 10, label %bb6
286   i32 11, label %bb5
287   i32 12, label %bb4
288   i32 13, label %bb3
289   i32 14, label %bb2
290   i32 15, label %bb1
291   i32 16, label %bb0
292   i32 17, label %bb7
293   i32 18, label %bb6
294   i32 19, label %bb5
295   i32 20, label %bb4
296   i32 21, label %bb3
297   i32 22, label %bb2
298   i32 23, label %bb1
299   i32 24, label %bb0
300   i32 25, label %bb7
301   i32 26, label %bb6
302   i32 27, label %bb5
303   i32 28, label %bb4
304   i32 29, label %bb3
305   i32 30, label %bb2
306   i32 31, label %bb1
307   i32 32, label %bb0
308   ]
310 sw.default: br label %return
311 bb0: br label %return
312 bb1: br label %return
313 bb2: br label %return
314 bb3: br label %return
315 bb4: br label %return
316 bb5: br label %return
317 bb6: br label %return
318 bb7: br label %return
320 return:
321   %res = phi i32 [ %y, %sw.default ], [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
322   ret i32 %res
326 ; A dense switch with an unreachable default case should be optimized into a lookup table without bounds checks
327 define i32 @unreachable_default_dense_0to32(i32 %x, i32 %y) {
328 ; CHECK-LABEL: @unreachable_default_dense_0to32(
329 ; CHECK-NEXT:  entry:
330 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [33 x i32], ptr @switch.table.unreachable_default_dense_0to32, i32 0, i32 [[X:%.*]]
331 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
332 ; CHECK-NEXT:    ret i32 [[SWITCH_LOAD]]
334 entry:
335   switch i32 %x, label %sw.default [
336   i32 0, label %bb0
337   i32 1, label %bb7
338   i32 2, label %bb6
339   i32 3, label %bb5
340   i32 4, label %bb4
341   i32 5, label %bb3
342   i32 6, label %bb2
343   i32 7, label %bb1
344   i32 8, label %bb0
345   i32 9, label %bb7
346   i32 10, label %bb6
347   i32 11, label %bb5
348   i32 12, label %bb4
349   i32 13, label %bb3
350   i32 14, label %bb2
351   i32 15, label %bb1
352   i32 16, label %bb0
353   i32 17, label %bb7
354   i32 18, label %bb6
355   i32 19, label %bb5
356   i32 20, label %bb4
357   i32 21, label %bb3
358   i32 22, label %bb2
359   i32 23, label %bb1
360   i32 24, label %bb0
361   i32 25, label %bb7
362   i32 26, label %bb6
363   i32 27, label %bb5
364   i32 28, label %bb4
365   i32 29, label %bb3
366   i32 30, label %bb2
367   i32 31, label %bb1
368   i32 32, label %bb0
369   ]
371 sw.default: unreachable
372 bb0: br label %return
373 bb1: br label %return
374 bb2: br label %return
375 bb3: br label %return
376 bb4: br label %return
377 bb5: br label %return
378 bb6: br label %return
379 bb7: br label %return
381 return:
382   %res = phi i32 [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
383   ret i32 %res
387 ; A sparse switch with a reachable default case which would be optimized into a lookup table with a bounds check and a mask, but doesn't because
388 ; it would require a 33-bit mask
389 define i32 @reachable_default_holes_0to32(i32 %x, i32 %y) {
390 ; CHECK-LABEL: @reachable_default_holes_0to32(
391 ; CHECK-NEXT:  entry:
392 ; CHECK-NEXT:    switch i32 [[X:%.*]], label [[RETURN:%.*]] [
393 ; CHECK-NEXT:      i32 0, label [[BB0:%.*]]
394 ; CHECK-NEXT:      i32 1, label [[BB7:%.*]]
395 ; CHECK-NEXT:      i32 2, label [[BB6:%.*]]
396 ; CHECK-NEXT:      i32 4, label [[BB4:%.*]]
397 ; CHECK-NEXT:      i32 5, label [[BB3:%.*]]
398 ; CHECK-NEXT:      i32 6, label [[BB2:%.*]]
399 ; CHECK-NEXT:      i32 7, label [[BB1:%.*]]
400 ; CHECK-NEXT:      i32 9, label [[BB7]]
401 ; CHECK-NEXT:      i32 10, label [[BB6]]
402 ; CHECK-NEXT:      i32 11, label [[BB5:%.*]]
403 ; CHECK-NEXT:      i32 12, label [[BB4]]
404 ; CHECK-NEXT:      i32 14, label [[BB2]]
405 ; CHECK-NEXT:      i32 15, label [[BB1]]
406 ; CHECK-NEXT:      i32 16, label [[BB0]]
407 ; CHECK-NEXT:      i32 17, label [[BB7]]
408 ; CHECK-NEXT:      i32 19, label [[BB5]]
409 ; CHECK-NEXT:      i32 20, label [[BB4]]
410 ; CHECK-NEXT:      i32 21, label [[BB3]]
411 ; CHECK-NEXT:      i32 22, label [[BB2]]
412 ; CHECK-NEXT:      i32 24, label [[BB0]]
413 ; CHECK-NEXT:      i32 25, label [[BB7]]
414 ; CHECK-NEXT:      i32 26, label [[BB6]]
415 ; CHECK-NEXT:      i32 27, label [[BB5]]
416 ; CHECK-NEXT:      i32 29, label [[BB3]]
417 ; CHECK-NEXT:      i32 30, label [[BB2]]
418 ; CHECK-NEXT:      i32 31, label [[BB1]]
419 ; CHECK-NEXT:      i32 32, label [[BB0]]
420 ; CHECK-NEXT:    ]
421 ; CHECK:       bb0:
422 ; CHECK-NEXT:    br label [[RETURN]]
423 ; CHECK:       bb1:
424 ; CHECK-NEXT:    br label [[RETURN]]
425 ; CHECK:       bb2:
426 ; CHECK-NEXT:    br label [[RETURN]]
427 ; CHECK:       bb3:
428 ; CHECK-NEXT:    br label [[RETURN]]
429 ; CHECK:       bb4:
430 ; CHECK-NEXT:    br label [[RETURN]]
431 ; CHECK:       bb5:
432 ; CHECK-NEXT:    br label [[RETURN]]
433 ; CHECK:       bb6:
434 ; CHECK-NEXT:    br label [[RETURN]]
435 ; CHECK:       bb7:
436 ; CHECK-NEXT:    br label [[RETURN]]
437 ; CHECK:       return:
438 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ 0, [[BB0]] ], [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ], [ 5, [[BB5]] ], [ 6, [[BB6]] ], [ 7, [[BB7]] ], [ [[Y:%.*]], [[ENTRY:%.*]] ]
439 ; CHECK-NEXT:    ret i32 [[RES]]
441 entry:
442   switch i32 %x, label %sw.default [
443   i32 0, label %bb0
444   i32 1, label %bb7
445   i32 2, label %bb6
446   i32 4, label %bb4
447   i32 5, label %bb3
448   i32 6, label %bb2
449   i32 7, label %bb1
450   i32 9, label %bb7
451   i32 10, label %bb6
452   i32 11, label %bb5
453   i32 12, label %bb4
454   i32 14, label %bb2
455   i32 15, label %bb1
456   i32 16, label %bb0
457   i32 17, label %bb7
458   i32 19, label %bb5
459   i32 20, label %bb4
460   i32 21, label %bb3
461   i32 22, label %bb2
462   i32 24, label %bb0
463   i32 25, label %bb7
464   i32 26, label %bb6
465   i32 27, label %bb5
466   i32 29, label %bb3
467   i32 30, label %bb2
468   i32 31, label %bb1
469   i32 32, label %bb0
470   ]
472 sw.default: br label %return
473 bb0: br label %return
474 bb1: br label %return
475 bb2: br label %return
476 bb3: br label %return
477 bb4: br label %return
478 bb5: br label %return
479 bb6: br label %return
480 bb7: br label %return
482 return:
483   %res = phi i32 [ %y, %sw.default ], [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
484   ret i32 %res
488 ; A sparse switch with an unreachable default case which can be optimized into a lookup table without bounds checks. Because the default case is
489 ; unreachable, the fact that a 33-bit mask would be required doesn't prevent lookup table optimization.
490 define i32 @unreachable_default_holes_0to32(i32 %x, i32 %y) {
491 ; CHECK-LABEL: @unreachable_default_holes_0to32(
492 ; CHECK-NEXT:  entry:
493 ; CHECK-NEXT:    [[SWITCH_GEP:%.*]] = getelementptr inbounds [33 x i32], ptr @switch.table.unreachable_default_holes_0to32, i32 0, i32 [[X:%.*]]
494 ; CHECK-NEXT:    [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
495 ; CHECK-NEXT:    ret i32 [[SWITCH_LOAD]]
497 entry:
498   switch i32 %x, label %sw.default [
499   i32 0, label %bb0
500   i32 1, label %bb7
501   i32 2, label %bb6
502   i32 4, label %bb4
503   i32 5, label %bb3
504   i32 6, label %bb2
505   i32 7, label %bb1
506   i32 9, label %bb7
507   i32 10, label %bb6
508   i32 11, label %bb5
509   i32 12, label %bb4
510   i32 14, label %bb2
511   i32 15, label %bb1
512   i32 16, label %bb0
513   i32 17, label %bb7
514   i32 19, label %bb5
515   i32 20, label %bb4
516   i32 21, label %bb3
517   i32 22, label %bb2
518   i32 24, label %bb0
519   i32 25, label %bb7
520   i32 26, label %bb6
521   i32 27, label %bb5
522   i32 29, label %bb3
523   i32 30, label %bb2
524   i32 31, label %bb1
525   i32 32, label %bb0
526   ]
528 sw.default: unreachable
529 bb0: br label %return
530 bb1: br label %return
531 bb2: br label %return
532 bb3: br label %return
533 bb4: br label %return
534 bb5: br label %return
535 bb6: br label %return
536 bb7: br label %return
538 return:
539   %res = phi i32 [ 0, %bb0 ], [ 1, %bb1 ], [ 2, %bb2 ], [ 3, %bb3 ], [ 4, %bb4 ], [ 5, %bb5 ], [ 6, %bb6 ], [ 7, %bb7 ]
540   ret i32 %res