[llvm] [X86]: Reassoc demorgan rule for ANDN (PR #163789)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 16 07:01:12 PDT 2025
================
@@ -51651,6 +51651,31 @@ static SDValue combineAndXorSubWithBMI(SDNode *And, const SDLoc &DL,
return AndN;
}
+// fold (not (or A, B)) -> nand(A, not(B)) if BMI
+static SDValue
+combineReassocDemorganWithNANDWithBMI(SDNode *Xor, const SDLoc &DL,
+ SelectionDAG &DAG,
+ const X86Subtarget &Subtarget) {
+ using namespace llvm::SDPatternMatch;
+
+ EVT VT = Xor->getValueType(0);
+ // Make sure this node is a candidate for BMI instructions.
+ if (!Subtarget.hasBMI() || (VT != MVT::i32 && VT != MVT::i64))
+ return SDValue();
+
+ SDValue A;
+ SDValue B;
+ APInt Cst;
+ if (!(sd_match(Xor, m_Xor(m_Or(m_Value(A), m_Value(B)), m_ConstInt(Cst))) &&
+ Cst.isAllOnes()))
+ return SDValue();
+
+ auto Opcode =
+ Subtarget.is64Bit() && VT == MVT::i64 ? X86::ANDN64rr : X86::ANDN32rr;
----------------
kper wrote:
Unfortunately, the `&& VT == MVT::i64` was required. Otherwise, it crashed during `copyPhysReg`
https://github.com/llvm/llvm-project/pull/163789
More information about the llvm-commits
mailing list