|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
|
2 |
| -; RUN: opt -S -passes='simplifycfg' < %s | FileCheck %s --check-prefix=OPTNOLUT |
| 2 | +; RUN: opt -S -passes='simplifycfg<switch-to-arithmetic>' < %s | FileCheck %s --check-prefix=OPTNOLUT |
3 | 3 | ; RUN: %if amdgpu-registered-target %{ opt -mtriple=amdgcn--amdpal -S -passes='simplifycfg<switch-to-lookup>' < %s | FileCheck %s --check-prefix=TTINOLUT %}
|
4 | 4 | ;
|
5 | 5 | target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
6 | 6 |
|
7 | 7 | define i32 @linear_transform_with_default(i32 %x) {
|
8 | 8 | ; OPTNOLUT-LABEL: define i32 @linear_transform_with_default(
|
9 | 9 | ; OPTNOLUT-SAME: i32 [[X:%.*]]) {
|
10 |
| -; OPTNOLUT-NEXT: [[ENTRY:.*]]: |
11 |
| -; OPTNOLUT-NEXT: switch i32 [[X]], label %[[END:.*]] [ |
12 |
| -; OPTNOLUT-NEXT: i32 0, label %[[CASE0:.*]] |
13 |
| -; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]] |
14 |
| -; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]] |
15 |
| -; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]] |
16 |
| -; OPTNOLUT-NEXT: ] |
17 |
| -; OPTNOLUT: [[CASE0]]: |
18 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
19 |
| -; OPTNOLUT: [[CASE1]]: |
20 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
21 |
| -; OPTNOLUT: [[CASE2]]: |
22 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
23 |
| -; OPTNOLUT: [[CASE3]]: |
24 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
25 |
| -; OPTNOLUT: [[END]]: |
26 |
| -; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 1, %[[CASE0]] ], [ 4, %[[CASE1]] ], [ 7, %[[CASE2]] ], [ 10, %[[CASE3]] ], [ 13, %[[ENTRY]] ] |
| 10 | +; OPTNOLUT-NEXT: [[ENTRY:.*:]] |
| 11 | +; OPTNOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 4 |
| 12 | +; OPTNOLUT-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul nsw i32 [[X]], 3 |
| 13 | +; OPTNOLUT-NEXT: [[SWITCH_OFFSET:%.*]] = add nsw i32 [[SWITCH_IDX_MULT]], 1 |
| 14 | +; OPTNOLUT-NEXT: [[IDX:%.*]] = select i1 [[TMP0]], i32 [[SWITCH_OFFSET]], i32 13 |
27 | 15 | ; OPTNOLUT-NEXT: ret i32 [[IDX]]
|
28 | 16 | ;
|
29 | 17 | ; TTINOLUT-LABEL: define i32 @linear_transform_with_default(
|
@@ -138,26 +126,8 @@ end:
|
138 | 126 | define i32 @linear_transform_no_default(i32 %x) {
|
139 | 127 | ; OPTNOLUT-LABEL: define i32 @linear_transform_no_default(
|
140 | 128 | ; OPTNOLUT-SAME: i32 [[X:%.*]]) {
|
141 |
| -; OPTNOLUT-NEXT: [[ENTRY:.*]]: |
142 |
| -; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [ |
143 |
| -; OPTNOLUT-NEXT: i32 0, label %[[END:.*]] |
144 |
| -; OPTNOLUT-NEXT: i32 1, label %[[CASE1:.*]] |
145 |
| -; OPTNOLUT-NEXT: i32 2, label %[[CASE2:.*]] |
146 |
| -; OPTNOLUT-NEXT: i32 3, label %[[CASE3:.*]] |
147 |
| -; OPTNOLUT-NEXT: i32 4, label %[[CASE4:.*]] |
148 |
| -; OPTNOLUT-NEXT: ] |
149 |
| -; OPTNOLUT: [[CASE1]]: |
150 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
151 |
| -; OPTNOLUT: [[CASE2]]: |
152 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
153 |
| -; OPTNOLUT: [[CASE3]]: |
154 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
155 |
| -; OPTNOLUT: [[CASE4]]: |
156 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
157 |
| -; OPTNOLUT: [[DEFAULT]]: |
158 |
| -; OPTNOLUT-NEXT: unreachable |
159 |
| -; OPTNOLUT: [[END]]: |
160 |
| -; OPTNOLUT-NEXT: [[SWITCH_IDX_MULT:%.*]] = phi i32 [ 3, %[[CASE1]] ], [ 6, %[[CASE2]] ], [ 9, %[[CASE3]] ], [ 12, %[[CASE4]] ], [ 0, %[[ENTRY]] ] |
| 129 | +; OPTNOLUT-NEXT: [[ENTRY:.*:]] |
| 130 | +; OPTNOLUT-NEXT: [[SWITCH_IDX_MULT:%.*]] = mul nsw i32 [[X]], 3 |
161 | 131 | ; OPTNOLUT-NEXT: ret i32 [[SWITCH_IDX_MULT]]
|
162 | 132 | ;
|
163 | 133 | ; TTINOLUT-LABEL: define i32 @linear_transform_no_default(
|
@@ -350,18 +320,9 @@ end:
|
350 | 320 | define i32 @single_value_withdefault(i32 %x) {
|
351 | 321 | ; OPTNOLUT-LABEL: define i32 @single_value_withdefault(
|
352 | 322 | ; OPTNOLUT-SAME: i32 [[X:%.*]]) {
|
353 |
| -; OPTNOLUT-NEXT: [[ENTRY:.*]]: |
354 |
| -; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [ |
355 |
| -; OPTNOLUT-NEXT: i32 0, label %[[END:.*]] |
356 |
| -; OPTNOLUT-NEXT: i32 1, label %[[END]] |
357 |
| -; OPTNOLUT-NEXT: i32 2, label %[[END]] |
358 |
| -; OPTNOLUT-NEXT: i32 3, label %[[END]] |
359 |
| -; OPTNOLUT-NEXT: i32 4, label %[[END]] |
360 |
| -; OPTNOLUT-NEXT: ] |
361 |
| -; OPTNOLUT: [[DEFAULT]]: |
362 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
363 |
| -; OPTNOLUT: [[END]]: |
364 |
| -; OPTNOLUT-NEXT: [[DOT:%.*]] = phi i32 [ 3, %[[DEFAULT]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ] |
| 323 | +; OPTNOLUT-NEXT: [[ENTRY:.*:]] |
| 324 | +; OPTNOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 5 |
| 325 | +; OPTNOLUT-NEXT: [[DOT:%.*]] = select i1 [[TMP0]], i32 2, i32 3 |
365 | 326 | ; OPTNOLUT-NEXT: ret i32 [[DOT]]
|
366 | 327 | ;
|
367 | 328 | ; TTINOLUT-LABEL: define i32 @single_value_withdefault(
|
@@ -401,18 +362,9 @@ end:
|
401 | 362 | define i32 @single_value_no_jump_tables(i32 %x) "no-jump-tables"="true" {
|
402 | 363 | ; OPTNOLUT-LABEL: define i32 @single_value_no_jump_tables(
|
403 | 364 | ; OPTNOLUT-SAME: i32 [[X:%.*]]) #[[ATTR0:[0-9]+]] {
|
404 |
| -; OPTNOLUT-NEXT: [[ENTRY:.*]]: |
405 |
| -; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [ |
406 |
| -; OPTNOLUT-NEXT: i32 0, label %[[END:.*]] |
407 |
| -; OPTNOLUT-NEXT: i32 1, label %[[END]] |
408 |
| -; OPTNOLUT-NEXT: i32 2, label %[[END]] |
409 |
| -; OPTNOLUT-NEXT: i32 3, label %[[END]] |
410 |
| -; OPTNOLUT-NEXT: i32 4, label %[[END]] |
411 |
| -; OPTNOLUT-NEXT: ] |
412 |
| -; OPTNOLUT: [[DEFAULT]]: |
413 |
| -; OPTNOLUT-NEXT: br label %[[END]] |
414 |
| -; OPTNOLUT: [[END]]: |
415 |
| -; OPTNOLUT-NEXT: [[IDX:%.*]] = phi i32 [ 3, %[[DEFAULT]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ], [ 2, %[[ENTRY]] ] |
| 365 | +; OPTNOLUT-NEXT: [[ENTRY:.*:]] |
| 366 | +; OPTNOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[X]], 5 |
| 367 | +; OPTNOLUT-NEXT: [[IDX:%.*]] = select i1 [[TMP0]], i32 2, i32 3 |
416 | 368 | ; OPTNOLUT-NEXT: ret i32 [[IDX]]
|
417 | 369 | ;
|
418 | 370 | ; TTINOLUT-LABEL: define i32 @single_value_no_jump_tables(
|
@@ -449,6 +401,60 @@ end:
|
449 | 401 | ret i32 %idx
|
450 | 402 | }
|
451 | 403 |
|
| 404 | +define i1 @single_value_with_mask(i32 %x) { |
| 405 | +; OPTNOLUT-LABEL: define i1 @single_value_with_mask( |
| 406 | +; OPTNOLUT-SAME: i32 [[X:%.*]]) { |
| 407 | +; OPTNOLUT-NEXT: [[ENTRY:.*]]: |
| 408 | +; OPTNOLUT-NEXT: switch i32 [[X]], label %[[DEFAULT:.*]] [ |
| 409 | +; OPTNOLUT-NEXT: i32 18, label %[[END:.*]] |
| 410 | +; OPTNOLUT-NEXT: i32 21, label %[[END]] |
| 411 | +; OPTNOLUT-NEXT: i32 48, label %[[END]] |
| 412 | +; OPTNOLUT-NEXT: i32 16, label %[[END]] |
| 413 | +; OPTNOLUT-NEXT: ] |
| 414 | +; OPTNOLUT: [[DEFAULT]]: |
| 415 | +; OPTNOLUT-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 80 |
| 416 | +; OPTNOLUT-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i1 false, i1 true |
| 417 | +; OPTNOLUT-NEXT: br label %[[END]] |
| 418 | +; OPTNOLUT: [[END]]: |
| 419 | +; OPTNOLUT-NEXT: [[RES:%.*]] = phi i1 [ false, %[[ENTRY]] ], [ false, %[[ENTRY]] ], [ false, %[[ENTRY]] ], [ false, %[[ENTRY]] ], [ [[SEL]], %[[DEFAULT]] ] |
| 420 | +; OPTNOLUT-NEXT: ret i1 [[RES]] |
| 421 | +; |
| 422 | +; TTINOLUT-LABEL: define i1 @single_value_with_mask( |
| 423 | +; TTINOLUT-SAME: i32 [[X:%.*]]) { |
| 424 | +; TTINOLUT-NEXT: [[ENTRY:.*]]: |
| 425 | +; TTINOLUT-NEXT: [[SWITCH_TABLEIDX:%.*]] = sub i32 [[X]], 16 |
| 426 | +; TTINOLUT-NEXT: [[TMP0:%.*]] = icmp ult i32 [[SWITCH_TABLEIDX]], 33 |
| 427 | +; TTINOLUT-NEXT: [[SWITCH_MASKINDEX:%.*]] = zext i32 [[SWITCH_TABLEIDX]] to i64 |
| 428 | +; TTINOLUT-NEXT: [[SWITCH_SHIFTED:%.*]] = lshr i64 4294967333, [[SWITCH_MASKINDEX]] |
| 429 | +; TTINOLUT-NEXT: [[SWITCH_LOBIT:%.*]] = trunc i64 [[SWITCH_SHIFTED]] to i1 |
| 430 | +; TTINOLUT-NEXT: [[OR_COND:%.*]] = select i1 [[TMP0]], i1 [[SWITCH_LOBIT]], i1 false |
| 431 | +; TTINOLUT-NEXT: br i1 [[OR_COND]], label %[[END:.*]], label %[[DEFAULT:.*]] |
| 432 | +; TTINOLUT: [[DEFAULT]]: |
| 433 | +; TTINOLUT-NEXT: [[CMP:%.*]] = icmp eq i32 [[X]], 80 |
| 434 | +; TTINOLUT-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i1 false, i1 true |
| 435 | +; TTINOLUT-NEXT: br label %[[END]] |
| 436 | +; TTINOLUT: [[END]]: |
| 437 | +; TTINOLUT-NEXT: [[RES:%.*]] = phi i1 [ [[SEL]], %[[DEFAULT]] ], [ false, %[[ENTRY]] ] |
| 438 | +; TTINOLUT-NEXT: ret i1 [[RES]] |
| 439 | +; |
| 440 | +entry: |
| 441 | + switch i32 %x, label %default [ |
| 442 | + i32 18, label %end |
| 443 | + i32 21, label %end |
| 444 | + i32 48, label %end |
| 445 | + i32 16, label %end |
| 446 | + ] |
| 447 | + |
| 448 | +default: |
| 449 | + %cmp = icmp eq i32 %x, 80 |
| 450 | + %sel = select i1 %cmp, i1 false, i1 true |
| 451 | + br label %end |
| 452 | + |
| 453 | +end: |
| 454 | + %res = phi i1 [ false, %entry ], [ false, %entry ], [ false, %entry ], [ false, %entry ], [ %sel, %default ] |
| 455 | + ret i1 %res |
| 456 | +} |
| 457 | + |
452 | 458 | define i32 @lookup_table(i32 %x) {
|
453 | 459 | ; OPTNOLUT-LABEL: define i32 @lookup_table(
|
454 | 460 | ; OPTNOLUT-SAME: i32 [[X:%.*]]) {
|
|
0 commit comments