diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp index 258891ae488da..4eb100db578d5 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp @@ -1027,10 +1027,8 @@ static SDValue lowerVECTOR_SHUFFLE_VSHUF4I(const SDLoc &DL, ArrayRef Mask, SelectionDAG &DAG) { unsigned SubVecSize = 4; - if (VT == MVT::v2f64 || VT == MVT::v2i64 || VT == MVT::v4f64 || - VT == MVT::v4i64) { + if (VT == MVT::v2f64 || VT == MVT::v2i64) SubVecSize = 2; - } int SubMask[4] = {-1, -1, -1, -1}; for (unsigned i = 0; i < SubVecSize; ++i) { @@ -1068,9 +1066,8 @@ static SDValue lowerVECTOR_SHUFFLE_VSHUF4I(const SDLoc &DL, ArrayRef Mask, Imm |= M & 0x3; } - // Return vshuf4i.d and xvshuf4i.d - if (VT == MVT::v2f64 || VT == MVT::v2i64 || VT == MVT::v4f64 || - VT == MVT::v4i64) + // Return vshuf4i.d + if (VT == MVT::v2f64 || VT == MVT::v2i64) return DAG.getNode(LoongArchISD::VSHUF4I, DL, VT, V1, V2, DAG.getConstant(Imm, DL, MVT::i64)); @@ -1458,6 +1455,10 @@ static SDValue lowerVECTOR_SHUFFLE_XVREPLVEI(const SDLoc &DL, static SDValue lowerVECTOR_SHUFFLE_XVSHUF4I(const SDLoc &DL, ArrayRef Mask, MVT VT, SDValue V1, SDValue V2, SelectionDAG &DAG) { + // When the size is less than or equal to 4, lower cost instructions may be + // used. + if (Mask.size() <= 4) + return SDValue(); return lowerVECTOR_SHUFFLE_VSHUF4I(DL, Mask, VT, V1, V2, DAG); } @@ -1839,9 +1840,6 @@ static SDValue lower256BitShuffle(const SDLoc &DL, ArrayRef Mask, MVT VT, return Result; if ((Result = lowerVECTOR_SHUFFLE_XVPICKOD(DL, NewMask, VT, V1, V2, DAG))) return Result; - if ((VT.SimpleTy == MVT::v4i64 || VT.SimpleTy == MVT::v4f64) && - (Result = lowerVECTOR_SHUFFLE_XVSHUF4I(DL, NewMask, VT, V1, V2, DAG))) - return Result; if ((Result = lowerVECTOR_SHUFFLEAsShift(DL, NewMask, VT, V1, V2, DAG, Zeroable))) return Result; diff --git a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td index ad5b49564f9cd..f2b22d0d64d6c 100644 --- a/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td +++ b/llvm/lib/Target/LoongArch/LoongArchLSXInstrInfo.td @@ -23,7 +23,7 @@ def SDT_LoongArchV2R : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>]>; def SDT_LoongArchV1RUimm: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisVT<2, i64>]>; -def SDT_LoongArchVShuf4i_D +def SDT_LoongArchV2RUimm : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0, 1>, SDTCisSameAs<1, 2>, SDTCisVT<3, i64>]>; @@ -57,8 +57,7 @@ def loongarch_vilvl: SDNode<"LoongArchISD::VILVL", SDT_LoongArchV2R>; def loongarch_vilvh: SDNode<"LoongArchISD::VILVH", SDT_LoongArchV2R>; def loongarch_vshuf4i: SDNode<"LoongArchISD::VSHUF4I", SDT_LoongArchV1RUimm>; -def loongarch_vshuf4i_d - : SDNode<"LoongArchISD::VSHUF4I", SDT_LoongArchVShuf4i_D>; +def loongarch_vshuf4i_d : SDNode<"LoongArchISD::VSHUF4I", SDT_LoongArchV2RUimm>; def loongarch_vreplvei: SDNode<"LoongArchISD::VREPLVEI", SDT_LoongArchV1RUimm>; def loongarch_vreplgr2vr: SDNode<"LoongArchISD::VREPLGR2VR", SDT_LoongArchVreplgr2vr>; diff --git a/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/shuffle-as-xvshuf4i.ll b/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/shuffle-as-xvshuf4i.ll index f3736f669db41..02186d23e31e5 100644 --- a/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/shuffle-as-xvshuf4i.ll +++ b/llvm/test/CodeGen/LoongArch/lasx/ir-instruction/shuffle-as-xvshuf4i.ll @@ -40,24 +40,4 @@ define <8 x float> @shufflevector_xvshuf4i_v8f32(<8 x float> %a, <8 x float> %b) ; CHECK-NEXT: ret %c = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> ret <8 x float> %c -} - -;; xvshuf4i.d -define <4 x i64> @shufflevector_xvshuf4i_v4d64(<4 x i64> %a, <4 x i64> %b) { -; CHECK-LABEL: shufflevector_xvshuf4i_v4d64: -; CHECK: # %bb.0: -; CHECK-NEXT: xvshuf4i.d $xr0, $xr1, 9 -; CHECK-NEXT: ret - %c = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> - ret <4 x i64> %c -} - -;; xvshuf4i.d -define <4 x double> @shufflevector_xvshuf4i_v4f64(<4 x double> %a, <4 x double> %b) { -; CHECK-LABEL: shufflevector_xvshuf4i_v4f64: -; CHECK: # %bb.0: -; CHECK-NEXT: xvshuf4i.d $xr0, $xr1, 9 -; CHECK-NEXT: ret - %c = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> - ret <4 x double> %c -} +} \ No newline at end of file