[llvm] 6f305e0 - [DAGCombiner] Limit graph traversal to cap compile times
Pranav Kant via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 26 10:29:45 PDT 2023
Author: Pranav Kant
Date: 2023-07-26T17:29:38Z
New Revision: 6f305e0658725aaf1acaff5c2c1500593e58d8f3
URL: https://github.com/llvm/llvm-project/commit/6f305e0658725aaf1acaff5c2c1500593e58d8f3
DIFF: https://github.com/llvm/llvm-project/commit/6f305e0658725aaf1acaff5c2c1500593e58d8f3.diff
LOG: [DAGCombiner] Limit graph traversal to cap compile times
hasPredecessorHelper method, that is used by DAGCombiner to combine to pre-indexed and post-indexed load/stores, is a major source of slowdown while compiling a large function with MSan enabled on Arm. This patch caps the DFS-graph traversal for this method to 8192 which cuts compile time by 50% (4m -> 2m compile time) at the cost of less overall nodes combined.
Here's the summary of pre-index DAG nodes created and time it took to compile the pathological case with different MaxDepth limit:
1. With MaxDepth = 0 (unlimited): 1800, took 4m
2. With MaxDepth = 32k, 560, took 2m31s
3. With MaxDepth = 8k, 139, took 2m.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D154885
Added:
Modified:
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 50a217355b733b..f579d99686eb6d 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -17666,6 +17666,7 @@ 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();
@@ -17676,7 +17677,8 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
if (Use.getUser() == Ptr.getNode() || Use != BasePtr)
continue;
- if (SDNode::hasPredecessorHelper(Use.getUser(), Visited, Worklist))
+ if (SDNode::hasPredecessorHelper(Use.getUser(), Visited, Worklist,
+ MaxSteps))
continue;
if (Use.getUser()->getOpcode() != ISD::ADD &&
@@ -17709,7 +17711,7 @@ bool DAGCombiner::CombineToPreIndexedLoadStore(SDNode *N) {
for (SDNode *Use : Ptr->uses()) {
if (Use == N)
continue;
- if (SDNode::hasPredecessorHelper(Use, Visited, Worklist))
+ if (SDNode::hasPredecessorHelper(Use, Visited, Worklist, MaxSteps))
return false;
// If Ptr may be folded in addressing mode of other use, then it's
@@ -17883,12 +17885,13 @@ 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);
Worklist.push_back(Op);
- if (!SDNode::hasPredecessorHelper(N, Visited, Worklist) &&
- !SDNode::hasPredecessorHelper(Op, Visited, Worklist))
+ if (!SDNode::hasPredecessorHelper(N, Visited, Worklist, MaxSteps) &&
+ !SDNode::hasPredecessorHelper(Op, Visited, Worklist, MaxSteps))
return Op;
}
return nullptr;
More information about the llvm-commits
mailing list