[llvm] [x86] Add lowering for `@llvm.experimental.vector.compress` (PR #104904)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 30 03:36:54 PDT 2024
================
@@ -17778,6 +17784,71 @@ static SDValue lowerVECTOR_SHUFFLE(SDValue Op, const X86Subtarget &Subtarget,
llvm_unreachable("Unimplemented!");
}
+// As legal vpcompress instructions depend on various AVX512 extensions, try to
+// convert illegal vector sizes to legal ones to avoid expansion.
+static SDValue lowerVECTOR_COMPRESS(SDValue Op, const X86Subtarget &Subtarget,
+ SelectionDAG &DAG) {
+ assert(Subtarget.hasAVX512() &&
+ "Need AVX512 for custom VECTOR_COMPRESS lowering.");
+
+ SDLoc DL(Op);
+ SDValue Vec = Op.getOperand(0);
+ SDValue Mask = Op.getOperand(1);
+ SDValue Passthru = Op.getOperand(2);
+
+ EVT VecVT = Vec.getValueType();
+ EVT ElementVT = VecVT.getVectorElementType();
+ unsigned NumElements = VecVT.getVectorNumElements();
+ unsigned NumVecBits = VecVT.getFixedSizeInBits();
+ unsigned NumElementBits = ElementVT.getFixedSizeInBits();
+
+ // 128- and 256-bit vectors with <= 16 elements can be converted to and
+ // compressed as 512-bit vectors in AVX512F.
+ if (NumVecBits != 128 && NumVecBits != 256)
+ return SDValue();
+
+ if (NumElementBits == 32 || NumElementBits == 64) {
+ unsigned NumLargeElements = 512 / NumElementBits;
+ EVT LargeVecVT =
+ MVT::getVectorVT(ElementVT.getSimpleVT(), NumLargeElements);
+ EVT LargeMaskVT = MVT::getVectorVT(MVT::i1, NumLargeElements);
+
+ SDValue InsertPos = DAG.getConstant(0, DL, MVT::i64);
+ Vec = DAG.getNode(ISD::INSERT_SUBVECTOR, DL, LargeVecVT,
+ DAG.getUNDEF(LargeVecVT), Vec, InsertPos);
+ Mask = DAG.getNode(
+ ISD::INSERT_SUBVECTOR, DL, LargeMaskVT,
+ DAG.getSplatVector(LargeMaskVT, DL, DAG.getConstant(0, DL, MVT::i1)),
+ Mask, InsertPos);
----------------
RKSimon wrote:
You can use the widenSubVector helper functions to insert into the zero/undef wider subvectors
https://github.com/llvm/llvm-project/pull/104904
More information about the llvm-commits
mailing list