[llvm] [DAG] foldAddToAvg - split nested m_Reassociatable matchers (PR #171681)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 12 08:27:39 PST 2025


https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/171681

>From a2a9d3e46b1108973cc513ed1f05c4fff8797845 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Wed, 10 Dec 2025 19:15:59 +0000
Subject: [PATCH] [DAG] foldAddToAvg - split nested m_Reassociatable matchers

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
---
 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 20 ++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

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);
   }
 



More information about the llvm-commits mailing list