[llvm] 19ee264 - [DAG] SimplifyDemandedBits - update (or (and X, C1), (and (or X, Y), C2)) fold with sd_match (#216012)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 13 07:39:14 PDT 2026
Author: Simon Pilgrim
Date: 2026-08-13T14:39:06Z
New Revision: 19ee26437bee27f96ddbeec222e5a2eb2c4530a7
URL: https://github.com/llvm/llvm-project/commit/19ee26437bee27f96ddbeec222e5a2eb2c4530a7
DIFF: https://github.com/llvm/llvm-project/commit/19ee26437bee27f96ddbeec222e5a2eb2c4530a7.diff
LOG: [DAG] SimplifyDemandedBits - update (or (and X, C1), (and (or X, Y), C2)) fold with sd_match (#216012)
Cleanup some nasty commutation matching code by using sd_match
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index d85bdcadab68f..97c998b6b842c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -1642,28 +1642,16 @@ bool TargetLowering::SimplifyDemandedBits(
// (or (and X, C1), (and (or X, Y), C2)) -> (or (and X, C1|C2), (and Y, C2))
// TODO: Use SimplifyMultipleUseDemandedBits to peek through masks.
- if (Op0.getOpcode() == ISD::AND && Op1.getOpcode() == ISD::AND &&
- Op0->hasOneUse() && Op1->hasOneUse()) {
- // Attempt to match all commutations - m_c_Or would've been useful!
- for (int I = 0; I != 2; ++I) {
- SDValue X = Op.getOperand(I).getOperand(0);
- SDValue C1 = Op.getOperand(I).getOperand(1);
- SDValue Alt = Op.getOperand(1 - I).getOperand(0);
- SDValue C2 = Op.getOperand(1 - I).getOperand(1);
- if (Alt.getOpcode() == ISD::OR) {
- for (int J = 0; J != 2; ++J) {
- if (X == Alt.getOperand(J)) {
- SDValue Y = Alt.getOperand(1 - J);
- if (SDValue C12 = TLO.DAG.FoldConstantArithmetic(ISD::OR, dl, VT,
- {C1, C2})) {
- SDValue MaskX = TLO.DAG.getNode(ISD::AND, dl, VT, X, C12);
- SDValue MaskY = TLO.DAG.getNode(ISD::AND, dl, VT, Y, C2);
- return TLO.CombineTo(
- Op, TLO.DAG.getNode(ISD::OR, dl, VT, MaskX, MaskY));
- }
- }
- }
- }
+ SDValue X, Y, C1, C2;
+ if (sd_match(Op, m_Or(m_OneUse(m_And(m_Value(X), m_Value(C1))),
+ m_OneUse(m_And(m_Or(m_Deferred(X), m_Value(Y)),
+ m_Value(C2)))))) {
+ if (SDValue C12 =
+ TLO.DAG.FoldConstantArithmetic(ISD::OR, dl, VT, {C1, C2})) {
+ SDValue MaskX = TLO.DAG.getNode(ISD::AND, dl, VT, X, C12);
+ SDValue MaskY = TLO.DAG.getNode(ISD::AND, dl, VT, Y, C2);
+ return TLO.CombineTo(Op,
+ TLO.DAG.getNode(ISD::OR, dl, VT, MaskX, MaskY));
}
}
More information about the llvm-commits
mailing list