[llvm] [InstCombine] Improve `foldDeadPhiWeb` compile time (PR #158057)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 05:27:48 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Mingjie Xu (Enna1)
<details>
<summary>Changes</summary>
The foldDeadPhiWeb function identifies and removes small dead PHI webs, it bails out if the web size exceeds threshold (16).
In the current implementation, when there is a phi node has large number of users that most of them are phi nodes, we still push them on the `Stack` even if the number of phi nodes user exceeds the threshold.
This patch checks the early stop condition when we push an unvisited phi node on the `Stack`.
With this change, the wall duration of total instcombine pass decreased from 523,649.276 ms to 30,239.399 ms in an our internal case.
---
Full diff: https://github.com/llvm/llvm-project/pull/158057.diff
1 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp (+7-6)
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
index ed9a0be6981fa..c3643a7cb4c08 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp
@@ -62,14 +62,15 @@ bool InstCombinerImpl::foldDeadPhiWeb(PHINode &PN) {
Stack.push_back(&PN);
while (!Stack.empty()) {
PHINode *Phi = Stack.pop_back_val();
- if (!Visited.insert(Phi).second)
- continue;
- // Early stop if the set of PHIs is large
- if (Visited.size() == 16)
- return false;
for (User *Use : Phi->users()) {
- if (PHINode *PhiUse = dyn_cast<PHINode>(Use))
+ if (PHINode *PhiUse = dyn_cast<PHINode>(Use)) {
+ if (!Visited.insert(Phi).second)
+ continue;
+ // Early stop if the set of PHIs is large
+ if (Visited.size() >= 16)
+ return false;
Stack.push_back(PhiUse);
+ }
else
return false;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/158057
More information about the llvm-commits
mailing list