| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,162 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | ||
| ; RUN: llc < %s -mtriple=riscv32 -mattr=+v -verify-machineinstrs | FileCheck --check-prefixes=CHECK,RV32 %s | ||
| ; RUN: llc < %s -mtriple=riscv64 -mattr=+v -verify-machineinstrs | FileCheck --check-prefixes=CHECK,RV64 %s | ||
|
|
||
| define i64 @i64(<vscale x 1 x i64> %v, i1 %c) { | ||
| ; RV32-LABEL: i64: | ||
| ; RV32: # %bb.0: | ||
| ; RV32-NEXT: addi sp, sp, -16 | ||
| ; RV32-NEXT: .cfi_def_cfa_offset 16 | ||
| ; RV32-NEXT: csrr a1, vlenb | ||
| ; RV32-NEXT: slli a1, a1, 1 | ||
| ; RV32-NEXT: sub sp, sp, a1 | ||
| ; RV32-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 2 * vlenb | ||
| ; RV32-NEXT: addi a1, sp, 16 | ||
| ; RV32-NEXT: vs1r.v v8, (a1) # Unknown-size Folded Spill | ||
| ; RV32-NEXT: andi a0, a0, 1 | ||
| ; RV32-NEXT: #APP | ||
| ; RV32-NEXT: #NO_APP | ||
| ; RV32-NEXT: beqz a0, .LBB0_2 | ||
| ; RV32-NEXT: # %bb.1: # %truebb | ||
| ; RV32-NEXT: li a0, 32 | ||
| ; RV32-NEXT: vl1r.v v9, (a1) # Unknown-size Folded Reload | ||
| ; RV32-NEXT: vsetivli zero, 1, e64, m1, ta, ma | ||
| ; RV32-NEXT: vsrl.vx v8, v9, a0 | ||
| ; RV32-NEXT: vmv.x.s a1, v8 | ||
| ; RV32-NEXT: vmv.x.s a0, v9 | ||
| ; RV32-NEXT: j .LBB0_3 | ||
| ; RV32-NEXT: .LBB0_2: # %falsebb | ||
| ; RV32-NEXT: li a1, 0 | ||
| ; RV32-NEXT: .LBB0_3: # %falsebb | ||
| ; RV32-NEXT: csrr a2, vlenb | ||
| ; RV32-NEXT: slli a2, a2, 1 | ||
| ; RV32-NEXT: add sp, sp, a2 | ||
| ; RV32-NEXT: addi sp, sp, 16 | ||
| ; RV32-NEXT: ret | ||
| ; | ||
| ; RV64-LABEL: i64: | ||
| ; RV64: # %bb.0: | ||
| ; RV64-NEXT: addi sp, sp, -16 | ||
| ; RV64-NEXT: .cfi_def_cfa_offset 16 | ||
| ; RV64-NEXT: csrr a1, vlenb | ||
| ; RV64-NEXT: slli a1, a1, 1 | ||
| ; RV64-NEXT: sub sp, sp, a1 | ||
| ; RV64-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 2 * vlenb | ||
| ; RV64-NEXT: addi a1, sp, 16 | ||
| ; RV64-NEXT: vs1r.v v8, (a1) # Unknown-size Folded Spill | ||
| ; RV64-NEXT: andi a0, a0, 1 | ||
| ; RV64-NEXT: #APP | ||
| ; RV64-NEXT: #NO_APP | ||
| ; RV64-NEXT: beqz a0, .LBB0_2 | ||
| ; RV64-NEXT: # %bb.1: # %truebb | ||
| ; RV64-NEXT: ld a0, 16(sp) # 8-byte Folded Reload | ||
| ; RV64-NEXT: .LBB0_2: # %falsebb | ||
| ; RV64-NEXT: csrr a1, vlenb | ||
| ; RV64-NEXT: slli a1, a1, 1 | ||
| ; RV64-NEXT: add sp, sp, a1 | ||
| ; RV64-NEXT: addi sp, sp, 16 | ||
| ; RV64-NEXT: ret | ||
| tail call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() | ||
| br i1 %c, label %truebb, label %falsebb | ||
| truebb: | ||
| %x = extractelement <vscale x 1 x i64> %v, i32 0 | ||
| ret i64 %x | ||
| falsebb: | ||
| ret i64 0 | ||
| } | ||
|
|
||
| define i32 @i32(<vscale x 2 x i32> %v, i1 %c) { | ||
| ; CHECK-LABEL: i32: | ||
| ; CHECK: # %bb.0: | ||
| ; CHECK-NEXT: addi sp, sp, -16 | ||
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: sub sp, sp, a1 | ||
| ; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 2 * vlenb | ||
| ; CHECK-NEXT: addi a1, sp, 16 | ||
| ; CHECK-NEXT: vs1r.v v8, (a1) # Unknown-size Folded Spill | ||
| ; CHECK-NEXT: andi a0, a0, 1 | ||
| ; CHECK-NEXT: #APP | ||
| ; CHECK-NEXT: #NO_APP | ||
| ; CHECK-NEXT: beqz a0, .LBB1_2 | ||
| ; CHECK-NEXT: # %bb.1: # %truebb | ||
| ; CHECK-NEXT: lw a0, 16(sp) # 8-byte Folded Reload | ||
| ; CHECK-NEXT: .LBB1_2: # %falsebb | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: add sp, sp, a1 | ||
| ; CHECK-NEXT: addi sp, sp, 16 | ||
| ; CHECK-NEXT: ret | ||
| tail call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() | ||
| br i1 %c, label %truebb, label %falsebb | ||
| truebb: | ||
| %x = extractelement <vscale x 2 x i32> %v, i32 0 | ||
| ret i32 %x | ||
| falsebb: | ||
| ret i32 0 | ||
| } | ||
|
|
||
| define i16 @i16(<vscale x 4 x i16> %v, i1 %c) { | ||
| ; CHECK-LABEL: i16: | ||
| ; CHECK: # %bb.0: | ||
| ; CHECK-NEXT: addi sp, sp, -16 | ||
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: sub sp, sp, a1 | ||
| ; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 2 * vlenb | ||
| ; CHECK-NEXT: addi a1, sp, 16 | ||
| ; CHECK-NEXT: vs1r.v v8, (a1) # Unknown-size Folded Spill | ||
| ; CHECK-NEXT: andi a0, a0, 1 | ||
| ; CHECK-NEXT: #APP | ||
| ; CHECK-NEXT: #NO_APP | ||
| ; CHECK-NEXT: beqz a0, .LBB2_2 | ||
| ; CHECK-NEXT: # %bb.1: # %truebb | ||
| ; CHECK-NEXT: lh a0, 16(sp) # 8-byte Folded Reload | ||
| ; CHECK-NEXT: .LBB2_2: # %falsebb | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: add sp, sp, a1 | ||
| ; CHECK-NEXT: addi sp, sp, 16 | ||
| ; CHECK-NEXT: ret | ||
| tail call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() | ||
| br i1 %c, label %truebb, label %falsebb | ||
| truebb: | ||
| %x = extractelement <vscale x 4 x i16> %v, i32 0 | ||
| ret i16 %x | ||
| falsebb: | ||
| ret i16 0 | ||
| } | ||
|
|
||
| define i8 @i8(<vscale x 8 x i8> %v, i1 %c) { | ||
| ; CHECK-LABEL: i8: | ||
| ; CHECK: # %bb.0: | ||
| ; CHECK-NEXT: addi sp, sp, -16 | ||
| ; CHECK-NEXT: .cfi_def_cfa_offset 16 | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: sub sp, sp, a1 | ||
| ; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x02, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 2 * vlenb | ||
| ; CHECK-NEXT: addi a1, sp, 16 | ||
| ; CHECK-NEXT: vs1r.v v8, (a1) # Unknown-size Folded Spill | ||
| ; CHECK-NEXT: andi a0, a0, 1 | ||
| ; CHECK-NEXT: #APP | ||
| ; CHECK-NEXT: #NO_APP | ||
| ; CHECK-NEXT: beqz a0, .LBB3_2 | ||
| ; CHECK-NEXT: # %bb.1: # %truebb | ||
| ; CHECK-NEXT: lb a0, 16(sp) # 8-byte Folded Reload | ||
| ; CHECK-NEXT: .LBB3_2: # %falsebb | ||
| ; CHECK-NEXT: csrr a1, vlenb | ||
| ; CHECK-NEXT: slli a1, a1, 1 | ||
| ; CHECK-NEXT: add sp, sp, a1 | ||
| ; CHECK-NEXT: addi sp, sp, 16 | ||
| ; CHECK-NEXT: ret | ||
| tail call void asm sideeffect "", "~{v0},~{v1},~{v2},~{v3},~{v4},~{v5},~{v6},~{v7},~{v8},~{v9},~{v10},~{v11},~{v12},~{v13},~{v14},~{v15},~{v16},~{v17},~{v18},~{v19},~{v20},~{v21},~{v22},~{v23},~{v24},~{v25},~{v26},~{v27},~{v28},~{v29},~{v30},~{v31}"() | ||
| br i1 %c, label %truebb, label %falsebb | ||
| truebb: | ||
| %x = extractelement <vscale x 8 x i8> %v, i32 0 | ||
| ret i8 %x | ||
| falsebb: | ||
| ret i8 0 | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,14 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | ||
| ; RUN: not llc --mtriple=xtensa < %s 2>&1 | FileCheck %s | ||
|
|
||
| define void @constraint_f() nounwind { | ||
| ; CHECK: error: unknown asm constraint 'f' | ||
| tail call void asm "addi a1, a1, $0", "f"(i32 1) | ||
| ret void | ||
| } | ||
|
|
||
| define i32 @register_a100(i32 %a) nounwind { | ||
| ; CHECK: error: couldn't allocate input reg for constraint '{$a100}' | ||
| %1 = tail call i32 asm "addi $0, $1, 1", "=r,{$a100}"(i32 %a) | ||
| ret i32 %1 | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
| ; RUN: llc --mtriple=xtensa < %s | FileCheck %s --check-prefix=XTENSA | ||
|
|
||
| define i32 @m_offset_0(ptr %p) nounwind { | ||
| ; XTENSA-LABEL: m_offset_0: | ||
| ; XTENSA: #APP | ||
| ; XTENSA-NEXT: l32i a2, a2, 0 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = call i32 asm "l32i $0, $1", "=r,*m"(ptr elementtype(i32) %p) | ||
| ret i32 %1 | ||
| } | ||
|
|
||
| define i32 @m_offset_1020(ptr %p) nounwind { | ||
| ; XTENSA-LABEL: m_offset_1020: | ||
| ; XTENSA: #APP | ||
| ; XTENSA-NEXT: l32i a2, a2, 1020 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = getelementptr inbounds i8, ptr %p, i32 1020 | ||
| %2 = call i32 asm "l32i $0, $1", "=r,*m"(ptr elementtype(i32) %1) | ||
| ret i32 %2 | ||
| } | ||
|
|
||
| define i8 @m_i8_offset_7(ptr %p) nounwind { | ||
| ; XTENSA-LABEL: m_i8_offset_7: | ||
| ; XTENSA: addi a8, a2, 7 | ||
| ; XTENSA-NEXT: #APP | ||
| ; XTENSA-NEXT: l8ui a2, a8, 0 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = getelementptr inbounds i8, ptr %p, i32 7 | ||
| %2 = call i8 asm "l8ui $0, $1", "=r,*m"(ptr elementtype(i8) %1) | ||
| ret i8 %2 | ||
| } | ||
|
|
||
| define i16 @m_i16_offset_10(ptr %p) nounwind { | ||
| ; XTENSA-LABEL: m_i16_offset_10: | ||
| ; XTENSA: #APP | ||
| ; XTENSA-NEXT: l16si a2, a2, 20 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = getelementptr inbounds i16, ptr %p, i32 10 | ||
| %2 = call i16 asm "l16si $0, $1", "=r,*m"(ptr elementtype(i16) %1) | ||
| ret i16 %2 | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,40 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 | ||
| ; RUN: llc -mtriple=xtensa < %s \ | ||
| ; RUN: | FileCheck -check-prefix=XTENSA %s | ||
|
|
||
| @gi = external global i32 | ||
|
|
||
| define i32 @constraint_r(i32 %a) { | ||
| ; XTENSA-LABEL: constraint_r: | ||
| ; XTENSA: l32r a8, .LCPI0_0 | ||
| ; XTENSA-NEXT: l32i a8, a8, 0 | ||
| ; XTENSA-NEXT: #APP | ||
| ; XTENSA-NEXT: add a2, a2, a8 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = load i32, ptr @gi | ||
| %2 = tail call i32 asm "add $0, $1, $2", "=r,r,r"(i32 %a, i32 %1) | ||
| ret i32 %2 | ||
| } | ||
|
|
||
| define i32 @constraint_i(i32 %a) { | ||
| ; XTENSA-LABEL: constraint_i: | ||
| ; XTENSA: #APP | ||
| ; XTENSA-NEXT: addi a2, a2, 113 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = load i32, ptr @gi | ||
| %2 = tail call i32 asm "addi $0, $1, $2", "=r,r,i"(i32 %a, i32 113) | ||
| ret i32 %2 | ||
| } | ||
|
|
||
| define i32 @explicit_register_a3(i32 %a) nounwind { | ||
| ; XTENSA-LABEL: explicit_register_a3: | ||
| ; XTENSA: or a3, a2, a2 | ||
| ; XTENSA-NEXT: #APP | ||
| ; XTENSA-NEXT: addi a2, a3, 1 | ||
| ; XTENSA-NEXT: #NO_APP | ||
| ; XTENSA-NEXT: ret | ||
| %1 = tail call i32 asm "addi $0, $1, 1", "=r,{a3}"(i32 %a) | ||
| ret i32 %1 | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,164 @@ | ||
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 | ||
| ; RUN: opt < %s -max-phi-entries-increase-after-removing-empty-block=12 -passes=simplifycfg -S | FileCheck --check-prefixes=CHECK-12 %s | ||
| ; RUN: opt < %s -max-phi-entries-increase-after-removing-empty-block=11 -passes=simplifycfg -S | FileCheck --check-prefixes=CHECK-11 %s | ||
| ; RUN: opt < %s -max-phi-entries-increase-after-removing-empty-block=4 -passes=simplifycfg -S | FileCheck --check-prefixes=CHECK-4 %s | ||
| ; | ||
| ; This test has the following CFG: | ||
| ; 1. entry has a switch to 4 blocks: B1 - B4 | ||
| ; 2. For B1 and B2, it branches to B5 and B6 | ||
| ; 3. For B3 and B4, it branches to B5 and B7 | ||
| ; 4. In B5, %val is defined as phi taking values from B1 to B4 | ||
| ; 5. B5, B6, B7 branch to block Merge unconditionally | ||
| ; 6. Block Merge has 5 phis(%x1 - %x4 and %val_merge). | ||
| ; | ||
| ; If we remove B5, %x1 - %x4 will increase the number of phi entries by (4 - 1) * 4 = 12. For %val_merge, since the value taking from B5 | ||
| ; is defined in B5, it will not increase the number of phi entries (it can be considered as move the entries from %val to | ||
| ; %val_merge). Therefore, removing B5 will increase the number of phi entries by 12 (not (4 - 1) * 5 = 15). | ||
| ; | ||
| ; If we remove B6 / B7, it will increase the number of phi entries by (2 - 1) * 5 = 5. | ||
| ; | ||
| ; In the first test, max-phi-entries-increase-after-removing-empty-block is set to be 12, then B5 will be removed. | ||
| ; In the second test, max-phi-entries-increase-after-removing-empty-block is set to be 11, then B5 should not be removed, | ||
| ; but B6 and B7 can be removed. | ||
| ; In the third test, max-phi-entries-increase-after-removing-empty-block is set to be 4, then no BB can be removed. | ||
| ; | ||
| define void @foo(i32 %a, i32 %val1, i32 %val2, i32 %val3, i32 %val4) { | ||
| ; CHECK-12-LABEL: define void @foo( | ||
| ; CHECK-12-SAME: i32 [[A:%.*]], i32 [[VAL1:%.*]], i32 [[VAL2:%.*]], i32 [[VAL3:%.*]], i32 [[VAL4:%.*]]) { | ||
| ; CHECK-12-NEXT: [[ENTRY:.*:]] | ||
| ; CHECK-12-NEXT: switch i32 [[A]], label %[[B1:.*]] [ | ||
| ; CHECK-12-NEXT: i32 4, label %[[B4:.*]] | ||
| ; CHECK-12-NEXT: i32 2, label %[[B2:.*]] | ||
| ; CHECK-12-NEXT: i32 3, label %[[B3:.*]] | ||
| ; CHECK-12-NEXT: ] | ||
| ; CHECK-12: [[B1]]: | ||
| ; CHECK-12-NEXT: [[CMP1:%.*]] = icmp eq i32 [[VAL1]], 1 | ||
| ; CHECK-12-NEXT: br i1 [[CMP1]], label %[[B6:.*]], label %[[MERGE:.*]] | ||
| ; CHECK-12: [[B2]]: | ||
| ; CHECK-12-NEXT: [[CMP2:%.*]] = icmp eq i32 [[VAL2]], 2 | ||
| ; CHECK-12-NEXT: br i1 [[CMP2]], label %[[B6]], label %[[MERGE]] | ||
| ; CHECK-12: [[B3]]: | ||
| ; CHECK-12-NEXT: [[CMP3:%.*]] = icmp eq i32 [[VAL3]], 3 | ||
| ; CHECK-12-NEXT: br i1 [[CMP3]], label %[[B7:.*]], label %[[MERGE]] | ||
| ; CHECK-12: [[B4]]: | ||
| ; CHECK-12-NEXT: [[CMP4:%.*]] = icmp eq i32 [[VAL4]], 4 | ||
| ; CHECK-12-NEXT: br i1 [[CMP4]], label %[[B7]], label %[[MERGE]] | ||
| ; CHECK-12: [[B6]]: | ||
| ; CHECK-12-NEXT: br label %[[MERGE]] | ||
| ; CHECK-12: [[B7]]: | ||
| ; CHECK-12-NEXT: br label %[[MERGE]] | ||
| ; CHECK-12: [[MERGE]]: | ||
| ; CHECK-12-NEXT: [[X1:%.*]] = phi i16 [ 0, %[[B6]] ], [ 2, %[[B7]] ], [ 1, %[[B4]] ], [ 1, %[[B3]] ], [ 1, %[[B2]] ], [ 1, %[[B1]] ] | ||
| ; CHECK-12-NEXT: [[X2:%.*]] = phi i16 [ 0, %[[B6]] ], [ 2, %[[B7]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ], [ 2, %[[B2]] ], [ 2, %[[B1]] ] | ||
| ; CHECK-12-NEXT: [[X3:%.*]] = phi i16 [ 0, %[[B6]] ], [ 2, %[[B7]] ], [ 3, %[[B4]] ], [ 3, %[[B3]] ], [ 3, %[[B2]] ], [ 3, %[[B1]] ] | ||
| ; CHECK-12-NEXT: [[X4:%.*]] = phi i16 [ 0, %[[B6]] ], [ 2, %[[B7]] ], [ 4, %[[B4]] ], [ 4, %[[B3]] ], [ 4, %[[B2]] ], [ 4, %[[B1]] ] | ||
| ; CHECK-12-NEXT: [[VAL_MERGE:%.*]] = phi i32 [ 0, %[[B6]] ], [ 2, %[[B7]] ], [ [[VAL1]], %[[B1]] ], [ [[VAL2]], %[[B2]] ], [ [[VAL3]], %[[B3]] ], [ [[VAL4]], %[[B4]] ] | ||
| ; CHECK-12-NEXT: ret void | ||
| ; | ||
| ; CHECK-11-LABEL: define void @foo( | ||
| ; CHECK-11-SAME: i32 [[A:%.*]], i32 [[VAL1:%.*]], i32 [[VAL2:%.*]], i32 [[VAL3:%.*]], i32 [[VAL4:%.*]]) { | ||
| ; CHECK-11-NEXT: [[ENTRY:.*:]] | ||
| ; CHECK-11-NEXT: switch i32 [[A]], label %[[B1:.*]] [ | ||
| ; CHECK-11-NEXT: i32 4, label %[[B4:.*]] | ||
| ; CHECK-11-NEXT: i32 2, label %[[B2:.*]] | ||
| ; CHECK-11-NEXT: i32 3, label %[[B3:.*]] | ||
| ; CHECK-11-NEXT: ] | ||
| ; CHECK-11: [[B1]]: | ||
| ; CHECK-11-NEXT: [[CMP1:%.*]] = icmp eq i32 [[VAL1]], 1 | ||
| ; CHECK-11-NEXT: br i1 [[CMP1]], label %[[MERGE:.*]], label %[[B5:.*]] | ||
| ; CHECK-11: [[B2]]: | ||
| ; CHECK-11-NEXT: [[CMP2:%.*]] = icmp eq i32 [[VAL2]], 2 | ||
| ; CHECK-11-NEXT: br i1 [[CMP2]], label %[[MERGE]], label %[[B5]] | ||
| ; CHECK-11: [[B3]]: | ||
| ; CHECK-11-NEXT: [[CMP3:%.*]] = icmp eq i32 [[VAL3]], 3 | ||
| ; CHECK-11-NEXT: br i1 [[CMP3]], label %[[MERGE]], label %[[B5]] | ||
| ; CHECK-11: [[B4]]: | ||
| ; CHECK-11-NEXT: [[CMP4:%.*]] = icmp eq i32 [[VAL4]], 4 | ||
| ; CHECK-11-NEXT: br i1 [[CMP4]], label %[[MERGE]], label %[[B5]] | ||
| ; CHECK-11: [[B5]]: | ||
| ; CHECK-11-NEXT: [[VAL:%.*]] = phi i32 [ [[VAL1]], %[[B1]] ], [ [[VAL2]], %[[B2]] ], [ [[VAL3]], %[[B3]] ], [ [[VAL4]], %[[B4]] ] | ||
| ; CHECK-11-NEXT: br label %[[MERGE]] | ||
| ; CHECK-11: [[MERGE]]: | ||
| ; CHECK-11-NEXT: [[X1:%.*]] = phi i16 [ 1, %[[B5]] ], [ 0, %[[B2]] ], [ 0, %[[B1]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ] | ||
| ; CHECK-11-NEXT: [[X2:%.*]] = phi i16 [ 2, %[[B5]] ], [ 0, %[[B2]] ], [ 0, %[[B1]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ] | ||
| ; CHECK-11-NEXT: [[X3:%.*]] = phi i16 [ 3, %[[B5]] ], [ 0, %[[B2]] ], [ 0, %[[B1]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ] | ||
| ; CHECK-11-NEXT: [[X4:%.*]] = phi i16 [ 4, %[[B5]] ], [ 0, %[[B2]] ], [ 0, %[[B1]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ] | ||
| ; CHECK-11-NEXT: [[VAL_MERGE:%.*]] = phi i32 [ [[VAL]], %[[B5]] ], [ 0, %[[B2]] ], [ 0, %[[B1]] ], [ 2, %[[B4]] ], [ 2, %[[B3]] ] | ||
| ; CHECK-11-NEXT: ret void | ||
| ; | ||
| ; CHECK-4-LABEL: define void @foo( | ||
| ; CHECK-4-SAME: i32 [[A:%.*]], i32 [[VAL1:%.*]], i32 [[VAL2:%.*]], i32 [[VAL3:%.*]], i32 [[VAL4:%.*]]) { | ||
| ; CHECK-4-NEXT: [[ENTRY:.*:]] | ||
| ; CHECK-4-NEXT: switch i32 [[A]], label %[[B1:.*]] [ | ||
| ; CHECK-4-NEXT: i32 4, label %[[B4:.*]] | ||
| ; CHECK-4-NEXT: i32 2, label %[[B2:.*]] | ||
| ; CHECK-4-NEXT: i32 3, label %[[B3:.*]] | ||
| ; CHECK-4-NEXT: ] | ||
| ; CHECK-4: [[B1]]: | ||
| ; CHECK-4-NEXT: [[CMP1:%.*]] = icmp eq i32 [[VAL1]], 1 | ||
| ; CHECK-4-NEXT: br i1 [[CMP1]], label %[[B6:.*]], label %[[B5:.*]] | ||
| ; CHECK-4: [[B2]]: | ||
| ; CHECK-4-NEXT: [[CMP2:%.*]] = icmp eq i32 [[VAL2]], 2 | ||
| ; CHECK-4-NEXT: br i1 [[CMP2]], label %[[B6]], label %[[B5]] | ||
| ; CHECK-4: [[B3]]: | ||
| ; CHECK-4-NEXT: [[CMP3:%.*]] = icmp eq i32 [[VAL3]], 3 | ||
| ; CHECK-4-NEXT: br i1 [[CMP3]], label %[[B7:.*]], label %[[B5]] | ||
| ; CHECK-4: [[B4]]: | ||
| ; CHECK-4-NEXT: [[CMP4:%.*]] = icmp eq i32 [[VAL4]], 4 | ||
| ; CHECK-4-NEXT: br i1 [[CMP4]], label %[[B7]], label %[[B5]] | ||
| ; CHECK-4: [[B5]]: | ||
| ; CHECK-4-NEXT: [[VAL:%.*]] = phi i32 [ [[VAL1]], %[[B1]] ], [ [[VAL2]], %[[B2]] ], [ [[VAL3]], %[[B3]] ], [ [[VAL4]], %[[B4]] ] | ||
| ; CHECK-4-NEXT: br label %[[MERGE:.*]] | ||
| ; CHECK-4: [[B6]]: | ||
| ; CHECK-4-NEXT: br label %[[MERGE]] | ||
| ; CHECK-4: [[B7]]: | ||
| ; CHECK-4-NEXT: br label %[[MERGE]] | ||
| ; CHECK-4: [[MERGE]]: | ||
| ; CHECK-4-NEXT: [[X1:%.*]] = phi i16 [ 1, %[[B5]] ], [ 0, %[[B6]] ], [ 2, %[[B7]] ] | ||
| ; CHECK-4-NEXT: [[X2:%.*]] = phi i16 [ 2, %[[B5]] ], [ 0, %[[B6]] ], [ 2, %[[B7]] ] | ||
| ; CHECK-4-NEXT: [[X3:%.*]] = phi i16 [ 3, %[[B5]] ], [ 0, %[[B6]] ], [ 2, %[[B7]] ] | ||
| ; CHECK-4-NEXT: [[X4:%.*]] = phi i16 [ 4, %[[B5]] ], [ 0, %[[B6]] ], [ 2, %[[B7]] ] | ||
| ; CHECK-4-NEXT: [[VAL_MERGE:%.*]] = phi i32 [ [[VAL]], %[[B5]] ], [ 0, %[[B6]] ], [ 2, %[[B7]] ] | ||
| ; CHECK-4-NEXT: ret void | ||
| ; | ||
| entry: | ||
| switch i32 %a, label %B1 [ | ||
| i32 4, label %B4 | ||
| i32 2, label %B2 | ||
| i32 3, label %B3 | ||
| ] | ||
|
|
||
| B1: ; preds = %entry | ||
| %cmp1 = icmp eq i32 %val1, 1 | ||
| br i1 %cmp1, label %B6, label %B5 | ||
|
|
||
| B2: ; preds = %entry | ||
| %cmp2 = icmp eq i32 %val2, 2 | ||
| br i1 %cmp2, label %B6, label %B5 | ||
|
|
||
| B3: ; preds = %entry | ||
| %cmp3 = icmp eq i32 %val3, 3 | ||
| br i1 %cmp3, label %B7, label %B5 | ||
|
|
||
| B4: ; preds = %entry | ||
| %cmp4 = icmp eq i32 %val4, 4 | ||
| br i1 %cmp4, label %B7, label %B5 | ||
|
|
||
| B5: ; preds = %B4, %B3, %B2, %B1 | ||
| %val = phi i32 [ %val1, %B1 ], [ %val2, %B2 ], [ %val3, %B3 ], [ %val4, %B4 ] | ||
| br label %Merge | ||
|
|
||
| B6: ; preds = %B2, %B1 | ||
| br label %Merge | ||
|
|
||
| B7: ; preds = %B4, %B3 | ||
| br label %Merge | ||
|
|
||
| Merge: ; preds = %B7, %B6, %B5 | ||
| %x1 = phi i16 [ 1, %B5 ], [ 0, %B6 ], [ 2, %B7 ] | ||
| %x2 = phi i16 [ 2, %B5 ], [ 0, %B6 ], [ 2, %B7 ] | ||
| %x3 = phi i16 [ 3, %B5 ], [ 0, %B6 ], [ 2, %B7 ] | ||
| %x4 = phi i16 [ 4, %B5 ], [ 0, %B6 ], [ 2, %B7 ] | ||
| %val_merge = phi i32 [ %val, %B5 ], [ 0, %B6 ], [ 2, %B7 ] | ||
| ret void | ||
| } |