Skip to content

Commit 5554883

Browse files
committed
[RISCV] Support vwsll in combineBinOp_VLToVWBinOp_VL
If the subtarget has +zvbb then we can attempt folding shl and shl_vl to vwsll nodes. There are few test cases where we still don't pick up the vwsll: - For fixed vector vwsll.vi on RV32, see the FIXME for VMV_V_X_VL in fillUpExtensionSupport for support implicit sign extension - For scalable vector vwsll.vi we need to support ISD::SPLAT_VECTOR, see #87249
1 parent 4e0b8ea commit 5554883

File tree

3 files changed

+100
-65
lines changed

3 files changed

+100
-65
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13543,6 +13543,7 @@ enum ExtKind : uint8_t { ZExt = 1 << 0, SExt = 1 << 1, FPExt = 1 << 2 };
1354313543
/// add | add_vl | or disjoint -> vwadd(u) | vwadd(u)_w
1354413544
/// sub | sub_vl -> vwsub(u) | vwsub(u)_w
1354513545
/// mul | mul_vl -> vwmul(u) | vwmul_su
13546+
/// shl | shl_vl -> vwsll
1354613547
/// fadd -> vfwadd | vfwadd_w
1354713548
/// fsub -> vfwsub | vfwsub_w
1354813549
/// fmul -> vfwmul
@@ -13721,6 +13722,9 @@ struct NodeExtensionHelper {
1372113722
case ISD::MUL:
1372213723
case RISCVISD::MUL_VL:
1372313724
return RISCVISD::VWMULU_VL;
13725+
case ISD::SHL:
13726+
case RISCVISD::SHL_VL:
13727+
return RISCVISD::VWSLL_VL;
1372413728
default:
1372513729
llvm_unreachable("Unexpected opcode");
1372613730
}
@@ -13871,7 +13875,8 @@ struct NodeExtensionHelper {
1387113875
}
1387213876

1387313877
/// Check if \p Root supports any extension folding combines.
13874-
static bool isSupportedRoot(const SDNode *Root) {
13878+
static bool isSupportedRoot(const SDNode *Root,
13879+
const RISCVSubtarget &Subtarget) {
1387513880
switch (Root->getOpcode()) {
1387613881
case ISD::ADD:
1387713882
case ISD::SUB:
@@ -13897,6 +13902,11 @@ struct NodeExtensionHelper {
1389713902
case RISCVISD::VFWADD_W_VL:
1389813903
case RISCVISD::VFWSUB_W_VL:
1389913904
return true;
13905+
case ISD::SHL:
13906+
return Root->getValueType(0).isScalableVector() &&
13907+
Subtarget.hasStdExtZvbb();
13908+
case RISCVISD::SHL_VL:
13909+
return Subtarget.hasStdExtZvbb();
1390013910
default:
1390113911
return false;
1390213912
}
@@ -13905,8 +13915,9 @@ struct NodeExtensionHelper {
1390513915
/// Build a NodeExtensionHelper for \p Root.getOperand(\p OperandIdx).
1390613916
NodeExtensionHelper(SDNode *Root, unsigned OperandIdx, SelectionDAG &DAG,
1390713917
const RISCVSubtarget &Subtarget) {
13908-
assert(isSupportedRoot(Root) && "Trying to build an helper with an "
13909-
"unsupported root");
13918+
assert(isSupportedRoot(Root, Subtarget) &&
13919+
"Trying to build an helper with an "
13920+
"unsupported root");
1391013921
assert(OperandIdx < 2 && "Requesting something else than LHS or RHS");
1391113922
assert(DAG.getTargetLoweringInfo().isTypeLegal(Root->getValueType(0)));
1391213923
OrigOperand = Root->getOperand(OperandIdx);
@@ -13958,12 +13969,13 @@ struct NodeExtensionHelper {
1395813969
static std::pair<SDValue, SDValue>
1395913970
getMaskAndVL(const SDNode *Root, SelectionDAG &DAG,
1396013971
const RISCVSubtarget &Subtarget) {
13961-
assert(isSupportedRoot(Root) && "Unexpected root");
13972+
assert(isSupportedRoot(Root, Subtarget) && "Unexpected root");
1396213973
switch (Root->getOpcode()) {
1396313974
case ISD::ADD:
1396413975
case ISD::SUB:
1396513976
case ISD::MUL:
13966-
case ISD::OR: {
13977+
case ISD::OR:
13978+
case ISD::SHL: {
1396713979
SDLoc DL(Root);
1396813980
MVT VT = Root->getSimpleValueType(0);
1396913981
return getDefaultScalableVLOps(VT, DL, DAG, Subtarget);
@@ -14001,6 +14013,8 @@ struct NodeExtensionHelper {
1400114013
case RISCVISD::VWSUBU_W_VL:
1400214014
case RISCVISD::FSUB_VL:
1400314015
case RISCVISD::VFWSUB_W_VL:
14016+
case ISD::SHL:
14017+
case RISCVISD::SHL_VL:
1400414018
return false;
1400514019
default:
1400614020
llvm_unreachable("Unexpected opcode");
@@ -14054,6 +14068,7 @@ struct CombineResult {
1405414068
case ISD::SUB:
1405514069
case ISD::MUL:
1405614070
case ISD::OR:
14071+
case ISD::SHL:
1405714072
Merge = DAG.getUNDEF(Root->getValueType(0));
1405814073
break;
1405914074
}
@@ -14224,6 +14239,11 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1422414239
// mul -> vwmulsu
1422514240
Strategies.push_back(canFoldToVW_SU);
1422614241
break;
14242+
case ISD::SHL:
14243+
case RISCVISD::SHL_VL:
14244+
// shl -> vwsll
14245+
Strategies.push_back(canFoldToVWWithZEXT);
14246+
break;
1422714247
case RISCVISD::VWADD_W_VL:
1422814248
case RISCVISD::VWSUB_W_VL:
1422914249
// vwadd_w|vwsub_w -> vwadd|vwsub
@@ -14251,6 +14271,7 @@ NodeExtensionHelper::getSupportedFoldings(const SDNode *Root) {
1425114271
/// add | add_vl | or disjoint -> vwadd(u) | vwadd(u)_w
1425214272
/// sub | sub_vl -> vwsub(u) | vwsub(u)_w
1425314273
/// mul | mul_vl -> vwmul(u) | vwmul_su
14274+
/// shl | shl_vl -> vwsll
1425414275
/// fadd_vl -> vfwadd | vfwadd_w
1425514276
/// fsub_vl -> vfwsub | vfwsub_w
1425614277
/// fmul_vl -> vfwmul
@@ -14265,7 +14286,7 @@ static SDValue combineBinOp_VLToVWBinOp_VL(SDNode *N,
1426514286
if (DCI.isBeforeLegalize())
1426614287
return SDValue();
1426714288

14268-
if (!NodeExtensionHelper::isSupportedRoot(N))
14289+
if (!NodeExtensionHelper::isSupportedRoot(N, Subtarget))
1426914290
return SDValue();
1427014291

1427114292
SmallVector<SDNode *> Worklist;
@@ -14276,7 +14297,7 @@ static SDValue combineBinOp_VLToVWBinOp_VL(SDNode *N,
1427614297

1427714298
while (!Worklist.empty()) {
1427814299
SDNode *Root = Worklist.pop_back_val();
14279-
if (!NodeExtensionHelper::isSupportedRoot(Root))
14300+
if (!NodeExtensionHelper::isSupportedRoot(Root, Subtarget))
1428014301
return SDValue();
1428114302

1428214303
NodeExtensionHelper LHS(N, 0, DAG, Subtarget);
@@ -16371,9 +16392,12 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1637116392
VPSN->getMemOperand(), IndexType);
1637216393
break;
1637316394
}
16395+
case RISCVISD::SHL_VL:
16396+
if (SDValue V = combineBinOp_VLToVWBinOp_VL(N, DCI, Subtarget))
16397+
return V;
16398+
[[fallthrough]];
1637416399
case RISCVISD::SRA_VL:
16375-
case RISCVISD::SRL_VL:
16376-
case RISCVISD::SHL_VL: {
16400+
case RISCVISD::SRL_VL: {
1637716401
SDValue ShAmt = N->getOperand(1);
1637816402
if (ShAmt.getOpcode() == RISCVISD::SPLAT_VECTOR_SPLIT_I64_VL) {
1637916403
// We don't need the upper 32 bits of a 64-bit element for a shift amount.
@@ -16393,6 +16417,10 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
1639316417
[[fallthrough]];
1639416418
case ISD::SRL:
1639516419
case ISD::SHL: {
16420+
if (N->getOpcode() == ISD::SHL) {
16421+
if (SDValue V = combineBinOp_VLToVWBinOp_VL(N, DCI, Subtarget))
16422+
return V;
16423+
}
1639616424
SDValue ShAmt = N->getOperand(1);
1639716425
if (ShAmt.getOpcode() == RISCVISD::SPLAT_VECTOR_SPLIT_I64_VL) {
1639816426
// We don't need the upper 32 bits of a 64-bit element for a shift amount.

llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vwsll.ll

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
22
; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
33
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s
4-
; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
5-
; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
4+
; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB32
5+
; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB64
66

77
; ==============================================================================
88
; i32 -> i64
@@ -111,8 +111,7 @@ define <4 x i64> @vwsll_vx_i32_v4i64_zext(<4 x i32> %a, i32 %b) {
111111
; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_zext:
112112
; CHECK-ZVBB: # %bb.0:
113113
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
114-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
115-
; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9
114+
; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0
116115
; CHECK-ZVBB-NEXT: vmv2r.v v8, v10
117116
; CHECK-ZVBB-NEXT: ret
118117
%head = insertelement <4 x i32> poison, i32 %b, i32 0
@@ -371,8 +370,7 @@ define <8 x i32> @vwsll_vx_i16_v8i32_zext(<8 x i16> %a, i16 %b) {
371370
; CHECK-ZVBB-LABEL: vwsll_vx_i16_v8i32_zext:
372371
; CHECK-ZVBB: # %bb.0:
373372
; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma
374-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
375-
; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9
373+
; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0
376374
; CHECK-ZVBB-NEXT: vmv2r.v v8, v10
377375
; CHECK-ZVBB-NEXT: ret
378376
%head = insertelement <8 x i16> poison, i16 %b, i32 0
@@ -499,6 +497,27 @@ define <16 x i16> @vwsll_vv_v16i16_zext(<16 x i8> %a, <16 x i8> %b) {
499497
}
500498

501499
define <16 x i16> @vwsll_vx_i64_v16i16(<16 x i8> %a, i64 %b) {
500+
; CHECK-ZVBB32-LABEL: vwsll_vx_i64_v16i16:
501+
; CHECK-ZVBB32: # %bb.0:
502+
; CHECK-ZVBB32-NEXT: vsetivli zero, 8, e64, m4, ta, ma
503+
; CHECK-ZVBB32-NEXT: vmv.v.x v16, a0
504+
; CHECK-ZVBB32-NEXT: vsetivli zero, 16, e64, m8, ta, ma
505+
; CHECK-ZVBB32-NEXT: vrgather.vi v24, v16, 0
506+
; CHECK-ZVBB32-NEXT: vsetvli zero, zero, e16, m2, ta, ma
507+
; CHECK-ZVBB32-NEXT: vzext.vf2 v10, v8
508+
; CHECK-ZVBB32-NEXT: vsetvli zero, zero, e32, m4, ta, ma
509+
; CHECK-ZVBB32-NEXT: vnsrl.wi v12, v24, 0
510+
; CHECK-ZVBB32-NEXT: vsetvli zero, zero, e16, m2, ta, ma
511+
; CHECK-ZVBB32-NEXT: vnsrl.wi v8, v12, 0
512+
; CHECK-ZVBB32-NEXT: vsll.vv v8, v10, v8
513+
; CHECK-ZVBB32-NEXT: ret
514+
;
515+
; CHECK-ZVBB64-LABEL: vwsll_vx_i64_v16i16:
516+
; CHECK-ZVBB64: # %bb.0:
517+
; CHECK-ZVBB64-NEXT: vsetivli zero, 16, e8, m1, ta, ma
518+
; CHECK-ZVBB64-NEXT: vwsll.vx v10, v8, a0
519+
; CHECK-ZVBB64-NEXT: vmv2r.v v8, v10
520+
; CHECK-ZVBB64-NEXT: ret
502521
%head = insertelement <8 x i64> poison, i64 %b, i32 0
503522
%splat = shufflevector <8 x i64> %head, <8 x i64> poison, <16 x i32> zeroinitializer
504523
%x = zext <16 x i8> %a to <16 x i16>
@@ -593,8 +612,7 @@ define <16 x i16> @vwsll_vx_i8_v16i16_zext(<16 x i8> %a, i8 %b) {
593612
; CHECK-ZVBB-LABEL: vwsll_vx_i8_v16i16_zext:
594613
; CHECK-ZVBB: # %bb.0:
595614
; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma
596-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
597-
; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9
615+
; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0
598616
; CHECK-ZVBB-NEXT: vmv2r.v v8, v10
599617
; CHECK-ZVBB-NEXT: ret
600618
%head = insertelement <16 x i8> poison, i8 %b, i32 0
@@ -661,10 +679,10 @@ define <4 x i64> @vwsll_vv_v4i64_v4i8_zext(<4 x i8> %a, <4 x i8> %b) {
661679
;
662680
; CHECK-ZVBB-LABEL: vwsll_vv_v4i64_v4i8_zext:
663681
; CHECK-ZVBB: # %bb.0:
664-
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
665-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
666-
; CHECK-ZVBB-NEXT: vzext.vf8 v12, v9
667-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
682+
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
683+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
684+
; CHECK-ZVBB-NEXT: vzext.vf4 v11, v9
685+
; CHECK-ZVBB-NEXT: vwsll.vv v8, v10, v11
668686
; CHECK-ZVBB-NEXT: ret
669687
%x = zext <4 x i8> %a to <4 x i64>
670688
%y = zext <4 x i8> %b to <4 x i64>
@@ -735,11 +753,8 @@ define <4 x i64> @vwsll_vx_i32_v4i64_v4i8_zext(<4 x i8> %a, i32 %b) {
735753
; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_v4i8_zext:
736754
; CHECK-ZVBB: # %bb.0:
737755
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
738-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
739-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
740-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
741-
; CHECK-ZVBB-NEXT: vzext.vf2 v12, v9
742-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
756+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
757+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
743758
; CHECK-ZVBB-NEXT: ret
744759
%head = insertelement <4 x i32> poison, i32 %b, i32 0
745760
%splat = shufflevector <4 x i32> %head, <4 x i32> poison, <4 x i32> zeroinitializer
@@ -790,12 +805,9 @@ define <4 x i64> @vwsll_vx_i16_v4i64_v4i8_zext(<4 x i8> %a, i16 %b) {
790805
;
791806
; CHECK-ZVBB-LABEL: vwsll_vx_i16_v4i64_v4i8_zext:
792807
; CHECK-ZVBB: # %bb.0:
793-
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
794-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
795-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
796-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
797-
; CHECK-ZVBB-NEXT: vzext.vf4 v12, v9
798-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
808+
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
809+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
810+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
799811
; CHECK-ZVBB-NEXT: ret
800812
%head = insertelement <4 x i16> poison, i16 %b, i32 0
801813
%splat = shufflevector <4 x i16> %head, <4 x i16> poison, <4 x i32> zeroinitializer
@@ -846,12 +858,9 @@ define <4 x i64> @vwsll_vx_i8_v4i64_v4i8_zext(<4 x i8> %a, i8 %b) {
846858
;
847859
; CHECK-ZVBB-LABEL: vwsll_vx_i8_v4i64_v4i8_zext:
848860
; CHECK-ZVBB: # %bb.0:
849-
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e8, mf4, ta, ma
850-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
851-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
852-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
853-
; CHECK-ZVBB-NEXT: vzext.vf8 v12, v9
854-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
861+
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma
862+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
863+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
855864
; CHECK-ZVBB-NEXT: ret
856865
%head = insertelement <4 x i8> poison, i8 %b, i32 0
857866
%splat = shufflevector <4 x i8> %head, <4 x i8> poison, <4 x i32> zeroinitializer
@@ -869,12 +878,19 @@ define <4 x i64> @vwsll_vi_v4i64_v4i8(<4 x i8> %a) {
869878
; CHECK-NEXT: vsll.vi v8, v10, 2
870879
; CHECK-NEXT: ret
871880
;
872-
; CHECK-ZVBB-LABEL: vwsll_vi_v4i64_v4i8:
873-
; CHECK-ZVBB: # %bb.0:
874-
; CHECK-ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma
875-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
876-
; CHECK-ZVBB-NEXT: vsll.vi v8, v10, 2
877-
; CHECK-ZVBB-NEXT: ret
881+
; CHECK-ZVBB32-LABEL: vwsll_vi_v4i64_v4i8:
882+
; CHECK-ZVBB32: # %bb.0:
883+
; CHECK-ZVBB32-NEXT: vsetivli zero, 4, e64, m2, ta, ma
884+
; CHECK-ZVBB32-NEXT: vzext.vf8 v10, v8
885+
; CHECK-ZVBB32-NEXT: vsll.vi v8, v10, 2
886+
; CHECK-ZVBB32-NEXT: ret
887+
;
888+
; CHECK-ZVBB64-LABEL: vwsll_vi_v4i64_v4i8:
889+
; CHECK-ZVBB64: # %bb.0:
890+
; CHECK-ZVBB64-NEXT: vsetivli zero, 4, e32, m1, ta, ma
891+
; CHECK-ZVBB64-NEXT: vzext.vf4 v10, v8
892+
; CHECK-ZVBB64-NEXT: vwsll.vi v8, v10, 2
893+
; CHECK-ZVBB64-NEXT: ret
878894
%x = zext <4 x i8> %a to <4 x i64>
879895
%z = shl <4 x i64> %x, splat (i64 2)
880896
ret <4 x i64> %z

llvm/test/CodeGen/RISCV/rvv/vwsll-sdnode.ll

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -665,10 +665,10 @@ define <vscale x 2 x i64> @vwsll_vv_nxv2i64_nxv2i8_zext(<vscale x 2 x i8> %a, <v
665665
;
666666
; CHECK-ZVBB-LABEL: vwsll_vv_nxv2i64_nxv2i8_zext:
667667
; CHECK-ZVBB: # %bb.0:
668-
; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
669-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
670-
; CHECK-ZVBB-NEXT: vzext.vf8 v12, v9
671-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
668+
; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
669+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
670+
; CHECK-ZVBB-NEXT: vzext.vf4 v11, v9
671+
; CHECK-ZVBB-NEXT: vwsll.vv v8, v10, v11
672672
; CHECK-ZVBB-NEXT: ret
673673
%x = zext <vscale x 2 x i8> %a to <vscale x 2 x i64>
674674
%y = zext <vscale x 2 x i8> %b to <vscale x 2 x i64>
@@ -739,11 +739,8 @@ define <vscale x 2 x i64> @vwsll_vx_i32_nxv2i64_nxv2i8_zext(<vscale x 2 x i8> %a
739739
; CHECK-ZVBB-LABEL: vwsll_vx_i32_nxv2i64_nxv2i8_zext:
740740
; CHECK-ZVBB: # %bb.0:
741741
; CHECK-ZVBB-NEXT: vsetvli a1, zero, e32, m1, ta, ma
742-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
743-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
744-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
745-
; CHECK-ZVBB-NEXT: vzext.vf2 v12, v9
746-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
742+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
743+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
747744
; CHECK-ZVBB-NEXT: ret
748745
%head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0
749746
%splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer
@@ -794,12 +791,9 @@ define <vscale x 2 x i64> @vwsll_vx_i16_nxv2i64_nxv2i8_zext(<vscale x 2 x i8> %a
794791
;
795792
; CHECK-ZVBB-LABEL: vwsll_vx_i16_nxv2i64_nxv2i8_zext:
796793
; CHECK-ZVBB: # %bb.0:
797-
; CHECK-ZVBB-NEXT: vsetvli a1, zero, e16, mf2, ta, ma
798-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
799-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
800-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
801-
; CHECK-ZVBB-NEXT: vzext.vf4 v12, v9
802-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
794+
; CHECK-ZVBB-NEXT: vsetvli a1, zero, e32, m1, ta, ma
795+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
796+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
803797
; CHECK-ZVBB-NEXT: ret
804798
%head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0
805799
%splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer
@@ -850,12 +844,9 @@ define <vscale x 2 x i64> @vwsll_vx_i8_nxv2i64_nxv2i8_zext(<vscale x 2 x i8> %a,
850844
;
851845
; CHECK-ZVBB-LABEL: vwsll_vx_i8_nxv2i64_nxv2i8_zext:
852846
; CHECK-ZVBB: # %bb.0:
853-
; CHECK-ZVBB-NEXT: vsetvli a1, zero, e8, mf4, ta, ma
854-
; CHECK-ZVBB-NEXT: vmv.v.x v9, a0
855-
; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma
856-
; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8
857-
; CHECK-ZVBB-NEXT: vzext.vf8 v12, v9
858-
; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12
847+
; CHECK-ZVBB-NEXT: vsetvli a1, zero, e32, m1, ta, ma
848+
; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8
849+
; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0
859850
; CHECK-ZVBB-NEXT: ret
860851
%head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0
861852
%splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer

0 commit comments

Comments
 (0)