[llvm] [AArch64][SVE] Use SVE for scalar FP converts in streaming[-compatible] functions (1/n) (PR #118505)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 17 03:53:39 PST 2024
================
@@ -19083,13 +19083,70 @@ static SDValue performVectorCompareAndMaskUnaryOpCombine(SDNode *N,
return SDValue();
}
+/// Tries to replace scalar FP <-> INT conversions with SVE in streaming
+/// functions, this can help to reduce the number of fmovs to/from GPRs.
+static SDValue
+tryToReplaceScalarFPConversionWithSVE(SDNode *N, SelectionDAG &DAG,
+ TargetLowering::DAGCombinerInfo &DCI,
+ const AArch64Subtarget *Subtarget) {
+ if (N->isStrictFPOpcode())
+ return SDValue();
+
+ if (DCI.isBeforeLegalizeOps())
+ return SDValue();
+
+ if (!Subtarget->isSVEorStreamingSVEAvailable() ||
+ (!Subtarget->isStreaming() && !Subtarget->isStreamingCompatible()))
+ return SDValue();
+
+ auto isSupportedType = [](EVT VT) {
+ return VT != MVT::bf16 && VT != MVT::f128;
+ };
+
+ if (!isSupportedType(N->getValueType(0)) ||
+ !isSupportedType(N->getOperand(0).getValueType()))
+ return SDValue();
+
+ SDValue SrcVal = N->getOperand(0);
+ EVT SrcTy = SrcVal.getValueType();
+ EVT DestTy = N->getValueType(0);
+
+ EVT SrcVecTy;
+ EVT DestVecTy;
+ if (DestTy.bitsGT(SrcTy)) {
+ DestVecTy = getPackedSVEVectorVT(DestTy);
+ SrcVecTy = DestVecTy.changeVectorElementType(SrcTy);
+ } else {
+ SrcVecTy = getPackedSVEVectorVT(SrcTy);
+ DestVecTy = SrcVecTy.changeVectorElementType(DestTy);
+ }
+
+ // Ensure the resulting src/dest vector type is legal.
+ if (SrcVecTy == MVT::nxv2i32 || DestVecTy == MVT::nxv2i32)
+ return SDValue();
+
+ SDLoc DL(N);
+ SDValue ZeroIdx = DAG.getVectorIdxConstant(0, DL);
+ SDValue Vec = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, SrcVecTy,
+ DAG.getUNDEF(SrcVecTy), SrcVal, ZeroIdx);
+ SDValue Convert = DAG.getNode(N->getOpcode(), DL, DestVecTy, Vec);
+ SDValue Scalar =
+ DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, DestTy, Convert, ZeroIdx);
+ return Scalar;
----------------
paulwalker-arm wrote:
```suggestion
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, DestTy, Convert, ZeroIdx);
```
https://github.com/llvm/llvm-project/pull/118505
More information about the llvm-commits
mailing list