[llvm] [LoongArch] Remove inaccurate LASX conversion pattern and use [X]VFFINT.S.L instead (PR #207107)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 2 01:44:40 PDT 2026
================
@@ -8151,15 +8158,91 @@ static SDValue ExtendSrcToDst(SDNode *N, SelectionDAG &DAG, unsigned ExtendOp) {
return DAG.getNode(N->getOpcode(), DL, VT, Extend);
}
+// Merge two 64 to 32 convert instructions into one,
+// e.g.
+// vffint.s.l $vr0, $vr1, $vr2
+// will convert 4 si64 into 4 float at once.
+// or
+// vftintrz.w.d $vr0, $vr1, $vr2
+// which will convert 4 double into 4 si32 at once.
+// also deal with their 256-bits LASX version.
+static SDValue MergeBlocksConvert(SDNode *N, SelectionDAG &DAG, unsigned Opcode,
+ unsigned BlockBits) {
+ SDLoc DL(N);
+ MVT DstVT = N->getSimpleValueType(0);
+ SDValue Src = N->getOperand(0);
+ MVT SrcVT = Src.getSimpleValueType();
+ unsigned SrcBits = SrcVT.getSizeInBits();
+
+ SmallVector<SDValue, 8> Blocks;
+ unsigned BlockNumElts = BlockBits / SrcVT.getScalarSizeInBits();
+ MVT BlockVT = MVT::getVectorVT(SrcVT.getScalarType(), BlockNumElts);
+ if (Src.getOpcode() == ISD::CONCAT_VECTORS &&
+ Src.getOperand(0).getValueType() == BlockVT) {
+ for (unsigned i = 0; i < Src.getNumOperands(); i++)
+ Blocks.push_back(Src.getOperand(i));
+ } else if (SrcBits > BlockBits) {
+ // Wider than one register: extract each BlockBits-wide sub-vector.
+ for (unsigned i = 0; i < SrcBits / BlockBits; i++)
+ Blocks.push_back(
+ DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, BlockVT, Src,
+ DAG.getVectorIdxConstant(i * BlockNumElts, DL)));
+ } else {
+ BlockBits = SrcBits;
+ Blocks.push_back(Src);
+ }
+
+ MVT NativeVT = MVT::getVectorVT(DstVT.getScalarType(),
+ BlockBits / DstVT.getScalarSizeInBits());
+ SmallVector<SDValue, 4> Parts;
+ for (unsigned i = 0; i < Blocks.size(); i += 2) {
+ SDValue Lo = Blocks[i];
+ SDValue Hi = Blocks.size() > 1 ? Blocks[i + 1] : Lo;
+ SDValue Res = DAG.getNode(Opcode, DL, NativeVT, Hi, Lo);
+
+ if (BlockBits == 256) {
+ SDValue Undef = DAG.getUNDEF(Res.getValueType());
----------------
wangleiat wrote:
`Res.getValueType == NativeVT` ?
https://github.com/llvm/llvm-project/pull/207107
More information about the llvm-commits
mailing list