|
1 |
| -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
2 |
| -; RUN: opt < %s -passes=simplifycfg -switch-to-lookup=true -keep-loops=false -S | FileCheck %s |
3 |
| -; RUN: opt < %s -passes='simplifycfg<no-keep-loops;switch-to-lookup>' -S | FileCheck %s |
| 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 |
4 | 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"
|
5 | 4 | target triple = "i386-pc-linux-gnu"
|
6 | 5 |
|
7 | 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 0, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 0, i32 2, i32 1, i32 0, i32 7, i32 0, i32 5, i32 4, i32 3, i32 2, i32 0, i32 0, i32 7, i32 6, i32 5, i32 0, 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 0, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 0, i32 2, i32 1, i32 0, i32 7, i32 0, i32 5, i32 4, i32 3, i32 2, i32 0, i32 0, i32 7, i32 6, i32 5, i32 0, 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 0, i32 4, i32 3, i32 2, i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 0, i32 2, i32 1, i32 0, i32 7, i32 0, i32 5, i32 4, i32 3, i32 2, i32 0, i32 0, i32 7, i32 6, i32 5, i32 0, i32 3, i32 2, i32 1, i32 0], align 4 |
| 15 | +;. |
8 | 16 | define i32 @reachable_default_dense_0to31(i32 %x, i32 %y) {
|
9 | 17 | ; CHECK-LABEL: @reachable_default_dense_0to31(
|
10 | 18 | ; CHECK-NEXT: entry:
|
@@ -198,10 +206,7 @@ return:
|
198 | 206 | define i32 @unreachable_default_holes_0to31(i32 %x, i32 %y) {
|
199 | 207 | ; CHECK-LABEL: @unreachable_default_holes_0to31(
|
200 | 208 | ; CHECK-NEXT: entry:
|
201 |
| -; CHECK-NEXT: [[SWITCH_SHIFTED:%.*]] = lshr i32 -277094665, [[X:%.*]] |
202 |
| -; CHECK-NEXT: [[SWITCH_LOBIT:%.*]] = trunc i32 [[SWITCH_SHIFTED]] to i1 |
203 |
| -; CHECK-NEXT: call void @llvm.assume(i1 [[SWITCH_LOBIT]]) |
204 |
| -; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.unreachable_default_holes_0to31, i32 0, i32 [[X]] |
| 209 | +; CHECK-NEXT: [[SWITCH_GEP:%.*]] = getelementptr inbounds [32 x i32], ptr @switch.table.unreachable_default_holes_0to31, i32 0, i32 [[X:%.*]] |
205 | 210 | ; CHECK-NEXT: [[SWITCH_LOAD:%.*]] = load i32, ptr [[SWITCH_GEP]], align 4
|
206 | 211 | ; CHECK-NEXT: ret i32 [[SWITCH_LOAD]]
|
207 | 212 | ;
|
@@ -485,54 +490,9 @@ return:
|
485 | 490 | define i32 @unreachable_default_holes_0to32(i32 %x, i32 %y) {
|
486 | 491 | ; CHECK-LABEL: @unreachable_default_holes_0to32(
|
487 | 492 | ; CHECK-NEXT: entry:
|
488 |
| -; CHECK-NEXT: switch i32 [[X:%.*]], label [[SW_DEFAULT:%.*]] [ |
489 |
| -; CHECK-NEXT: i32 0, label [[RETURN:%.*]] |
490 |
| -; CHECK-NEXT: i32 1, label [[BB7:%.*]] |
491 |
| -; CHECK-NEXT: i32 2, label [[BB6:%.*]] |
492 |
| -; CHECK-NEXT: i32 4, label [[BB4:%.*]] |
493 |
| -; CHECK-NEXT: i32 5, label [[BB3:%.*]] |
494 |
| -; CHECK-NEXT: i32 6, label [[BB2:%.*]] |
495 |
| -; CHECK-NEXT: i32 7, label [[BB1:%.*]] |
496 |
| -; CHECK-NEXT: i32 9, label [[BB7]] |
497 |
| -; CHECK-NEXT: i32 10, label [[BB6]] |
498 |
| -; CHECK-NEXT: i32 11, label [[BB5:%.*]] |
499 |
| -; CHECK-NEXT: i32 12, label [[BB4]] |
500 |
| -; CHECK-NEXT: i32 14, label [[BB2]] |
501 |
| -; CHECK-NEXT: i32 15, label [[BB1]] |
502 |
| -; CHECK-NEXT: i32 16, label [[RETURN]] |
503 |
| -; CHECK-NEXT: i32 17, label [[BB7]] |
504 |
| -; CHECK-NEXT: i32 19, label [[BB5]] |
505 |
| -; CHECK-NEXT: i32 20, label [[BB4]] |
506 |
| -; CHECK-NEXT: i32 21, label [[BB3]] |
507 |
| -; CHECK-NEXT: i32 22, label [[BB2]] |
508 |
| -; CHECK-NEXT: i32 24, label [[RETURN]] |
509 |
| -; CHECK-NEXT: i32 25, label [[BB7]] |
510 |
| -; CHECK-NEXT: i32 26, label [[BB6]] |
511 |
| -; CHECK-NEXT: i32 27, label [[BB5]] |
512 |
| -; CHECK-NEXT: i32 29, label [[BB3]] |
513 |
| -; CHECK-NEXT: i32 30, label [[BB2]] |
514 |
| -; CHECK-NEXT: i32 31, label [[BB1]] |
515 |
| -; CHECK-NEXT: i32 32, label [[RETURN]] |
516 |
| -; CHECK-NEXT: ] |
517 |
| -; CHECK: sw.default: |
518 |
| -; CHECK-NEXT: unreachable |
519 |
| -; CHECK: bb1: |
520 |
| -; CHECK-NEXT: br label [[RETURN]] |
521 |
| -; CHECK: bb2: |
522 |
| -; CHECK-NEXT: br label [[RETURN]] |
523 |
| -; CHECK: bb3: |
524 |
| -; CHECK-NEXT: br label [[RETURN]] |
525 |
| -; CHECK: bb4: |
526 |
| -; CHECK-NEXT: br label [[RETURN]] |
527 |
| -; CHECK: bb5: |
528 |
| -; CHECK-NEXT: br label [[RETURN]] |
529 |
| -; CHECK: bb6: |
530 |
| -; CHECK-NEXT: br label [[RETURN]] |
531 |
| -; CHECK: bb7: |
532 |
| -; CHECK-NEXT: br label [[RETURN]] |
533 |
| -; CHECK: return: |
534 |
| -; CHECK-NEXT: [[RES:%.*]] = phi i32 [ 1, [[BB1]] ], [ 2, [[BB2]] ], [ 3, [[BB3]] ], [ 4, [[BB4]] ], [ 5, [[BB5]] ], [ 6, [[BB6]] ], [ 7, [[BB7]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY]] ], [ 0, [[ENTRY]] ], [ 0, [[ENTRY]] ] |
535 |
| -; CHECK-NEXT: ret i32 [[RES]] |
| 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]] |
536 | 496 | ;
|
537 | 497 | entry:
|
538 | 498 | switch i32 %x, label %sw.default [
|
|
0 commit comments