[llvm] [DAG] foldAddToAvg - split nested m_Reassociatable matchers (PR #171681)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 10 12:52:38 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
The use of nested m_Reassociatable matchers by #<!-- -->169644 can result in high compile times as the inner m_Reassociatable call is being repeated a lot while the outer call is trying to match
---
Full diff: https://github.com/llvm/llvm-project/pull/171681.diff
1 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (+11-9)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 6a99d4e29b64f..267063beac015 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -3164,26 +3164,28 @@ SDValue DAGCombiner::visitADDLike(SDNode *N) {
SDValue DAGCombiner::foldAddToAvg(SDNode *N, const SDLoc &DL) {
SDValue N0 = N->getOperand(0);
EVT VT = N0.getValueType();
- SDValue A, B;
+ SDValue A, B, C;
if ((!LegalOperations || hasOperation(ISD::AVGFLOORU, VT)) &&
(sd_match(N,
m_Add(m_And(m_Value(A), m_Value(B)),
m_Srl(m_Xor(m_Deferred(A), m_Deferred(B)), m_One()))) ||
- sd_match(N, m_ReassociatableAdd(
- m_Srl(m_Value(A), m_One()), m_Srl(m_Value(B), m_One()),
- m_ReassociatableAnd(m_Deferred(A), m_Deferred(B),
- m_One()))))) {
+ (sd_match(N,
+ m_ReassociatableAdd(m_Srl(m_Value(A), m_One()),
+ m_Srl(m_Value(B), m_One()), m_Value(C))) &&
+ sd_match(
+ C, m_ReassociatableAnd(m_Deferred(A), m_Deferred(B), m_One()))))) {
return DAG.getNode(ISD::AVGFLOORU, DL, VT, A, B);
}
if ((!LegalOperations || hasOperation(ISD::AVGFLOORS, VT)) &&
(sd_match(N,
m_Add(m_And(m_Value(A), m_Value(B)),
m_Sra(m_Xor(m_Deferred(A), m_Deferred(B)), m_One()))) ||
- sd_match(N, m_ReassociatableAdd(
- m_Sra(m_Value(A), m_One()), m_Sra(m_Value(B), m_One()),
- m_ReassociatableAnd(m_Deferred(A), m_Deferred(B),
- m_One()))))) {
+ (sd_match(N,
+ m_ReassociatableAdd(m_Sra(m_Value(A), m_One()),
+ m_Sra(m_Value(B), m_One()), m_Value(C))) &&
+ sd_match(
+ C, m_ReassociatableAnd(m_Deferred(A), m_Deferred(B), m_One()))))) {
return DAG.getNode(ISD::AVGFLOORS, DL, VT, A, B);
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/171681
More information about the llvm-commits
mailing list