[llvm] [AArch64][SVE] Add basic support for `@llvm.masked.compressstore` (PR #168350)
Benjamin Maxwell via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 17 11:51:04 PST 2025
================
@@ -30180,6 +30185,36 @@ SDValue AArch64TargetLowering::LowerFixedLengthVectorStoreToSVE(
Store->isTruncatingStore());
}
+SDValue AArch64TargetLowering::LowerMSTORE(SDValue Op,
+ SelectionDAG &DAG) const {
+ SDLoc DL(Op);
+ auto *Store = cast<MaskedStoreSDNode>(Op);
+ EVT VT = Store->getValue().getValueType();
+ if (VT.isFixedLengthVector())
+ return LowerFixedLengthVectorMStoreToSVE(Op, DAG);
+
+ if (!Store->isCompressingStore())
+ return SDValue();
+
+ EVT MaskVT = Store->getMask().getValueType();
+
+ SDValue Zero = DAG.getConstant(0, DL, MVT::i64);
+ SDValue CntActive =
+ DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i64, Store->getMask());
----------------
MacDue wrote:
I'm not sure about using `ISD::PARTIAL_REDUCE_#MLA`, but the following works:
```
EVT MaskExtVT = getPromotedVTForPredicate(MaskVT);
EVT MaskReduceVT = MaskExtVT.getScalarType();
SDValue MaskExt =
DAG.getNode(ISD::ZERO_EXTEND, DL, MaskExtVT, Store->getMask());
SDValue CntActive =
DAG.getNode(ISD::VECREDUCE_ADD, DL, MaskReduceVT, MaskExt);
if (MaskReduceVT != MVT::i64)
CntActive = DAG.getNode(ISD::ZERO_EXTEND, DL, MVT::i64, CntActive);
```
If we also define that the demanded bits for `aarch64_sve_cntp` is a most 9 (max value 256, AFAIK), which allows the `ZERO_EXTEND` to fold away.
https://github.com/llvm/llvm-project/pull/168350
More information about the llvm-commits
mailing list