| ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=riscv64 -mattr='+v' -stop-before=riscv-insert-vsetvli %s -o - | FileCheck %s |
| |
| define <32 x i64> @main(i1 %tobool93.not, <32 x i64> %0, <32 x i64> %1) #0 { |
| ; CHECK-LABEL: name: main |
| ; CHECK: bb.0.entry: |
| ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) |
| ; CHECK-NEXT: liveins: $x10, $x11, $v8m8, $v16m8 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x11 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x10 |
| ; CHECK-NEXT: BNE $x0, $x0, %bb.2 |
| ; CHECK-NEXT: PseudoBR %bb.1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1.BS_LABEL_5: |
| ; CHECK-NEXT: renamable $v8m8 = PseudoVMV_V_I_M8 undef renamable $v8m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: $v16m8 = COPY renamable $v8m8 |
| ; CHECK-NEXT: PseudoRET implicit $v8m8, implicit $v16m8 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2.BS_LABEL_8: |
| ; CHECK-NEXT: successors: %bb.4(0x40000000), %bb.3(0x40000000) |
| ; CHECK-NEXT: liveins: $v8m8:0x0000000000000002, $v16m8:0x0000000000000006 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: renamable $v24m8 = PseudoVLE64_V_M8 undef renamable $v24m8, [[COPY]], 16 /* vl */, 6 /* e64 */, 2 /* tu, ma */ :: (load (s1024)) |
| ; CHECK-NEXT: [[ANDI:%[0-9]+]]:gpr = ANDI [[COPY1]], 1 |
| ; CHECK-NEXT: BNE [[ANDI]], $x0, %bb.4 |
| ; CHECK-NEXT: PseudoBR %bb.3 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.3.cond.true94: |
| ; CHECK-NEXT: successors: %bb.4(0x80000000) |
| ; CHECK-NEXT: liveins: $v8m8:0x0000000000000002, $v16m8:0x0000000000000006, $v24m8:0x0000000000000002 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.4.cond.end98: |
| ; CHECK-NEXT: successors: %bb.6(0x30000000), %bb.5(0x50000000) |
| ; CHECK-NEXT: liveins: $v8m8:0x0000000000000002, $v16m8:0x0000000000000006, $v24m8:0x0000000000000002 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[PseudoVMV_X_S:%[0-9]+]]:gpr = PseudoVMV_X_S killed renamable $v24, 6 /* e64 */ |
| ; CHECK-NEXT: BEQ [[PseudoVMV_X_S]], $x0, %bb.6 |
| ; CHECK-NEXT: PseudoBR %bb.5 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.5.cond.true108: |
| ; CHECK-NEXT: successors: %bb.7(0x80000000) |
| ; CHECK-NEXT: liveins: $v8m8:0x0000000000000002, $v16m8:0x0000000000000006 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: VS8R_V renamable $v8m8, %stack.0 :: (store (<vscale x 1 x s512>) into %stack.0, align 8) |
| ; CHECK-NEXT: PseudoBR %bb.7 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.6.cond.false111: |
| ; CHECK-NEXT: successors: %bb.7(0x80000000) |
| ; CHECK-NEXT: liveins: $v8m8:0x0000000000000002, $v16m8:0x0000000000000006 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: VS8R_V renamable $v8m8, %stack.0 :: (store (<vscale x 1 x s512>) into %stack.0, align 8) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.7.cond.end113: |
| ; CHECK-NEXT: successors: %bb.8(0x40000000), %bb.9(0x40000000) |
| ; CHECK-NEXT: liveins: $v16m8:0x0000000000000006 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: renamable $v0m8 = PseudoVMV_V_I_M8 undef renamable $v0m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: renamable $v24m8 = COPY renamable $v0m8 |
| ; CHECK-NEXT: renamable $v8m2 = PseudoVSLIDEDOWN_VI_M2 undef renamable $v8m2, killed renamable $v16m2, 2, 1 /* vl */, 6 /* e64 */, 3 /* ta, ma */ |
| ; CHECK-NEXT: [[PseudoVMV_X_S1:%[0-9]+]]:gpr = PseudoVMV_X_S killed renamable $v8, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v24m8 = PseudoVMV_V_V_M8 killed renamable $v24m8, killed renamable $v0m8, 1 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: BNE [[PseudoVMV_X_S1]], $x0, %bb.9 |
| ; CHECK-NEXT: PseudoBR %bb.8 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.8.cond.true128: |
| ; CHECK-NEXT: successors: %bb.9(0x80000000) |
| ; CHECK-NEXT: liveins: $v24m8 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.9.cond.end133: |
| ; CHECK-NEXT: liveins: $v24m8 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: renamable $v0m8 = PseudoVMV_V_I_M8 undef renamable $v0m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: renamable $v16 = COPY renamable $v0 |
| ; CHECK-NEXT: renamable $v8m8 = VL8RE8_V %stack.0 :: (load (<vscale x 1 x s512>) from %stack.0, align 8) |
| ; CHECK-NEXT: [[PseudoVMV_X_S2:%[0-9]+]]:gpr = PseudoVMV_X_S killed renamable $v8, 5 /* e32 */ |
| ; CHECK-NEXT: renamable $v8m8 = COPY renamable $v0m8 |
| ; CHECK-NEXT: early-clobber renamable $v17 = PseudoVMSLEU_VV_M8 killed renamable $v0m8, killed renamable $v24m8, 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v16 = PseudoVMV_S_X killed renamable $v16, $x0, 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v16 = PseudoVMV_S_X killed renamable $v16, [[PseudoVMV_X_S2]], 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v24m8 = PseudoVMV_V_I_M8 undef renamable $v24m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: renamable $v8 = COPY killed renamable $v16 |
| ; CHECK-NEXT: $v0 = COPY killed renamable $v17 |
| ; CHECK-NEXT: renamable $v16m8 = PseudoVMERGE_VIM_M8 undef renamable $v16m8, killed renamable $v24m8, -1, $v0, 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v24m8 = PseudoVMV_V_I_M8 undef renamable $v24m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: early-clobber renamable $v0 = PseudoVMSLEU_VV_M8 killed renamable $v24m8, killed renamable $v8m8, 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: renamable $v8m8 = PseudoVMV_V_I_M8 undef renamable $v8m8, 0, 16 /* vl */, 6 /* e64 */, 0 /* tu, mu */ |
| ; CHECK-NEXT: renamable $v8m8 = PseudoVMERGE_VIM_M8 undef renamable $v8m8, killed renamable $v8m8, -1, $v0, 16 /* vl */, 6 /* e64 */ |
| ; CHECK-NEXT: PseudoRET implicit $v8m8, implicit $v16m8 |
| entry: |
| switch i32 0, label %BS_LABEL_5 [ |
| i32 3, label %BS_LABEL_5 |
| i32 4, label %BS_LABEL_8 |
| ] |
| |
| BS_LABEL_5: ; preds = %entry, %entry |
| ret <32 x i64> zeroinitializer |
| |
| BS_LABEL_8: ; preds = %entry |
| %conv76 = zext <32 x i8> zeroinitializer to <32 x i64> |
| %. = select i1 false, <32 x i64> zeroinitializer, <32 x i64> zeroinitializer |
| br i1 %tobool93.not, label %cond.end98, label %cond.true94 |
| |
| cond.true94: ; preds = %BS_LABEL_8 |
| %vecext95 = extractelement <32 x i64> zeroinitializer, i64 0 |
| br label %cond.end98 |
| |
| cond.end98: ; preds = %cond.true94, %BS_LABEL_8 |
| %vecext106 = extractelement <32 x i64> %1, i64 0 |
| %tobool107.not = icmp eq i64 %vecext106, 0 |
| br i1 %tobool107.not, label %cond.false111, label %cond.true108 |
| |
| cond.true108: ; preds = %cond.end98 |
| %vecext109 = extractelement <32 x i64> zeroinitializer, i64 0 |
| br label %cond.end113 |
| |
| cond.false111: ; preds = %cond.end98 |
| %vecext112 = extractelement <32 x i64> zeroinitializer, i64 0 |
| br label %cond.end113 |
| |
| cond.end113: ; preds = %cond.false111, %cond.true108 |
| %cond114 = phi i64 [ 0, %cond.true108 ], [ 1, %cond.false111 ] |
| %2 = insertelement <32 x i64> zeroinitializer, i64 %cond114, i64 0 |
| %vecext123 = extractelement <32 x i64> %conv76, i64 0 |
| %3 = insertelement <32 x i64> %2, i64 0, i64 0 |
| %vecinit125 = insertelement <32 x i64> %3, i64 %vecext123, i64 16 |
| %vecext126 = extractelement <32 x i64> %0, i64 18 |
| %cmp = icmp ult i64 %vecext126, 1 |
| br i1 %cmp, label %cond.true128, label %cond.end133 |
| |
| cond.true128: ; preds = %cond.end113 |
| %vecext129 = extractelement <32 x i64> zeroinitializer, i64 0 |
| br label %cond.end133 |
| |
| cond.end133: ; preds = %cond.true128, %cond.end113 |
| %vecinit147 = insertelement <32 x i64> %vecinit125, i64 0, i64 0 |
| %4 = bitcast <32 x i64> %0 to <64 x i32> |
| %sh_prom = extractelement <64 x i32> %4, i64 0 |
| %conv164 = sext i32 %sh_prom to i64 |
| %vecinit165 = insertelement <32 x i64> %vecinit147, i64 %conv164, i64 0 |
| %cmp166 = icmp ule <32 x i64> %., %vecinit165 |
| %sext = sext <32 x i1> %cmp166 to <32 x i64> |
| ret <32 x i64> %sext |
| } |
| |
| attributes #0 = { "target-features"="+v" } |