[llvm] [AArch64][SVE] Rework VECTOR_COMPRESS lowering (PR #171162)
Benjamin Maxwell via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 9 02:31:09 PST 2025
================
@@ -7445,60 +7448,43 @@ static SDValue convertFromSVEContainerType(SDLoc DL, SDValue Vec, EVT VecVT,
return Vec;
}
-SDValue AArch64TargetLowering::LowerVECTOR_COMPRESS(SDValue Op,
- SelectionDAG &DAG) const {
+SDValue AArch64TargetLowering::LowerFixedLengthVectorCompressToSVE(
+ SDValue Op, SelectionDAG &DAG) const {
SDLoc DL(Op);
- SDValue Vec = Op.getOperand(0);
- SDValue Mask = Op.getOperand(1);
- SDValue Passthru = Op.getOperand(2);
- EVT VecVT = Vec.getValueType();
- EVT MaskVT = Mask.getValueType();
- EVT ElmtVT = VecVT.getVectorElementType();
- const bool IsFixedLength = VecVT.isFixedLengthVector();
- const bool HasPassthru = !Passthru.isUndef();
- unsigned MinElmts = VecVT.getVectorElementCount().getKnownMinValue();
- EVT FixedVecVT = MVT::getVectorVT(ElmtVT.getSimpleVT(), MinElmts);
+ EVT VT = Op.getValueType();
- assert(VecVT.isVector() && "Input to VECTOR_COMPRESS must be vector.");
+ EVT ContainerVT = getContainerForFixedLengthVector(DAG, VT);
+ SDValue Vec = convertToScalableVector(DAG, ContainerVT, Op.getOperand(0));
+ SDValue Mask = convertFixedMaskToScalableVector(Op.getOperand(1), DAG);
+ SDValue Passthru =
+ convertToScalableVector(DAG, ContainerVT, Op.getOperand(2));
- if (!Subtarget->isSVEAvailable())
- return SDValue();
+ SDValue Result =
+ DAG.getNode(ISD::VECTOR_COMPRESS, DL, ContainerVT, Vec, Mask, Passthru);
+ return convertFromScalableVector(DAG, VT, Result);
+}
- if (IsFixedLength && VecVT.getSizeInBits().getFixedValue() > 128)
- return SDValue();
+SDValue AArch64TargetLowering::LowerVECTOR_COMPRESS(SDValue Op,
+ SelectionDAG &DAG) const {
+ SDLoc DL(Op);
+ EVT VT = Op.getValueType();
+ if (VT.isFixedLengthVector())
+ return LowerFixedLengthVectorCompressToSVE(Op, DAG);
----------------
MacDue wrote:
Yes, this is a common pattern for these lowerings. This converts the arguments to scalable vectors, which produces another `VECTOR_COMPRESS` node, which then is custom lowered again.
https://github.com/llvm/llvm-project/pull/171162
More information about the llvm-commits
mailing list