[llvm] [X86] Fold splat AND on VGF2P8AFFINEQB source (PR #193364)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 23 02:16:33 PDT 2026
================
@@ -61882,6 +61882,64 @@ static SDValue combineKSHIFT(SDNode *N, SelectionDAG &DAG,
return SDValue();
}
+static SDValue combineAndOnGF2P8AFFINEQBOperand(SDNode *N, const SDLoc &DL,
+ SelectionDAG &DAG, EVT VT) {
+ using namespace SDPatternMatch;
+
+ SDValue X, Y, SplatOp;
+ APInt Imm, SplatVal, ConstUndef;
+ SmallVector<APInt> ConstEltBits;
+
+ // Removing the same bit within each matrix's row effectively treats the
+ // corresponding source bit like it is set to zero
+ // TODO: Add reverse fold when X is constant
+ if (sd_match(N, m_TernaryOp(X86ISD::GF2P8AFFINEQB, m_Value(AndOp), m_Value(Y),
+ m_ConstInt(Imm))) &&
+ sd_match(AndOp, m_And(m_Value(X), m_Value(SplatOp))) &&
+ getTargetConstantBitsFromNode(Y, Y.getScalarValueSizeInBits(), ConstUndef,
+ ConstEltBits, /*AllowWholeUndefs=*/false)) {
+ bool splatIsConst =
+ X86::isConstantSplat(SplatOp, SplatVal, /*AllowPartialUndefs=*/false);
+
+ // Can still shorten the chain when constant folded with the matrix
+ if (!AndOp->hasOneUse() && !splatIsConst)
+ return SDValue();
+
+ if (!(splatIsConst || DAG.isSplatValue(SplatOp, /*AllowUndefs=*/false)) ||
+ SplatOp.getScalarValueSizeInBits() != 8)
----------------
RKSimon wrote:
Can SplatOp be anything but a vXi8 type?
https://github.com/llvm/llvm-project/pull/193364
More information about the llvm-commits
mailing list