[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
Thu Dec 5 07:23:52 PST 2024
================
@@ -18989,13 +18989,75 @@ 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,
+ const AArch64Subtarget *Subtarget) {
+ if (N->isStrictFPOpcode())
+ return SDValue();
+
+ if (!Subtarget->isSVEorStreamingSVEAvailable() ||
+ (!Subtarget->isStreaming() && !Subtarget->isStreamingCompatible()))
+ return SDValue();
+
+ auto isSupportedType = [](EVT VT) {
+ if (!VT.isSimple())
+ return false;
+ // There are SVE instructions that can convert to/from all pairs of these
+ // int and float types. Note: We don't bother with i8 or i16 as those are
+ // illegal types for scalars.
+ return is_contained({MVT::i32, MVT::i64, MVT::f16, MVT::f32, MVT::f64},
+ VT.getSimpleVT().SimpleTy);
+ };
+
+ 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);
+
+ bool IsI32ToF64 = SrcTy == MVT::i32 && DestTy == MVT::f64;
+ bool isF64ToI32 = SrcTy == MVT::f64 && DestTy == MVT::i32;
+
+ // Conversions between f64 and i32 are a special case as nxv2i32 is an illegal
+ // type (unlike the equivalent nxv2f32 for floating-point types).
+ // TODO: Support these conversations.
+ if (IsI32ToF64 || isF64ToI32)
+ return SDValue();
+
+ EVT SrcVecTy;
+ EVT DestVecTy;
+ if (DestTy.bitsGT(SrcTy)) {
+ DestVecTy = getPackedSVEVectorVT(DestTy);
+ SrcVecTy = SrcTy == MVT::i32 ? getPackedSVEVectorVT(SrcTy)
+ : DestVecTy.changeVectorElementType(SrcTy);
----------------
paulwalker-arm wrote:
Can this be just `SrcVecTy = DestVecTy.changeVectorElementType(SrcTy)` now that you're bailing for the special case above?
https://github.com/llvm/llvm-project/pull/118505
More information about the llvm-commits
mailing list