[llvm] [DAGCombiner] Limit steps in shouldCombineToPostInc (PR #116030)
Jonathan Cohen via llvm-commits
llvm-commits at lists.llvm.org
Sun Nov 17 01:58:30 PST 2024
https://github.com/jcohen-apple updated https://github.com/llvm/llvm-project/pull/116030
>From 787ab75594ec0bfe0c401160b48086eeac203d4a Mon Sep 17 00:00:00 2001
From: Jonathan Cohen <jcohen22 at apple.com>
Date: Wed, 13 Nov 2024 11:56:06 +0200
Subject: [PATCH] [DAGCombiner] Limit steps in shouldCombineToPostInc
Currently the function will walk the entire DAG to find other
candidates to perform a post-inc store. This leads to very long
compilation times on large functions. Added a MaxSteps limit to
avoid this, which is also aligned to how hasPredecessorHelper is
used elsewhere in the code.
---
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 6059229cd6d9a4..521829675ae7c3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -149,6 +149,11 @@ static cl::opt<bool> EnableVectorFCopySignExtendRound(
cl::desc(
"Enable merging extends and rounds into FCOPYSIGN on vector types"));
+static cl::opt<unsigned int>
+ MaxSteps("has-predecessor-max-steps", cl::Hidden, cl::init(8192),
+ cl::desc("DAG combiner limit number of steps when searching DAG "
+ "for predecessor nodes"));
+
namespace {
class DAGCombiner {
@@ -18911,7 +18916,6 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
// can be folded with this one. We should do this to avoid having to keep
// a copy of the original base pointer.
SmallVector<SDNode *, 16> OtherUses;
- constexpr unsigned int MaxSteps = 8192;
if (isa<ConstantSDNode>(Offset))
for (SDNode::use_iterator UI = BasePtr->use_begin(),
UE = BasePtr->use_end();
@@ -19089,7 +19093,7 @@ static bool shouldCombineToPostInc(SDNode *N, SDValue Ptr, SDNode *PtrUse,
IsMasked, OtherPtr, TLI)) {
SmallVector<const SDNode *, 2> Worklist;
Worklist.push_back(Use);
- if (SDNode::hasPredecessorHelper(N, Visited, Worklist))
+ if (SDNode::hasPredecessorHelper(N, Visited, Worklist, MaxSteps))
return false;
}
}
@@ -19130,7 +19134,6 @@ static SDNode *getPostIndexedLoadStoreOp(SDNode *N, bool &IsLoad,
// Check for #2.
SmallPtrSet<const SDNode *, 32> Visited;
SmallVector<const SDNode *, 8> Worklist;
- constexpr unsigned int MaxSteps = 8192;
// Ptr is predecessor to both N and Op.
Visited.insert(Ptr.getNode());
Worklist.push_back(N);
More information about the llvm-commits
mailing list