[llvm] [SSAUpdater] Only iterate blocks modified by CheckIfPHIMatches() in ordMatchingPHIs() (PR #153596)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 14 08:22:29 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Mingjie Xu (Enna1)
<details>
<summary>Changes</summary>
In https://github.com/llvm/llvm-project/pull/100281, we use `TaggedBlocks` to record blocks modified by `CheckIfPHIMatche()`, so do not need to clear every block in `BlockList` if `CheckIfPHIMatches()` match failed.
If `CheckIfPHIMatches()` match succeed, we can reuse `TaggedBlocks` to only record matching PHIs for modified blocks, avoid checking every block in `BlockList` to see if `PHITag` is set.
---
Full diff: https://github.com/llvm/llvm-project/pull/153596.diff
1 Files Affected:
- (modified) llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h (+13-13)
``````````diff
diff --git a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
index 746926e5bee33..52fe3a6f4baf4 100644
--- a/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
+++ b/llvm/include/llvm/Transforms/Utils/SSAUpdaterImpl.h
@@ -366,7 +366,7 @@ class SSAUpdaterImpl {
continue;
// Look for an existing PHI.
- FindExistingPHI(Info->BB, BlockList);
+ FindExistingPHI(Info->BB);
if (Info->AvailableVal)
continue;
@@ -412,11 +412,11 @@ class SSAUpdaterImpl {
/// FindExistingPHI - Look through the PHI nodes in a block to see if any of
/// them match what is needed.
- void FindExistingPHI(BlkT *BB, BlockListTy *BlockList) {
+ void FindExistingPHI(BlkT *BB) {
SmallVector<BBInfo *, 20> TaggedBlocks;
for (auto &SomePHI : BB->phis()) {
if (CheckIfPHIMatches(&SomePHI, TaggedBlocks)) {
- RecordMatchingPHIs(BlockList);
+ RecordMatchingPHIs(TaggedBlocks);
break;
}
}
@@ -424,7 +424,7 @@ class SSAUpdaterImpl {
/// CheckIfPHIMatches - Check if a PHI node matches the placement and values
/// in the BBMap.
- bool CheckIfPHIMatches(PhiT *PHI, SmallVectorImpl<BBInfo *> &TaggedBlocks) {
+ bool CheckIfPHIMatches(PhiT *PHI, BlockListTy &TaggedBlocks) {
// Match failed: clear all the PHITag values. Only need to clear visited
// blocks.
auto Cleanup = make_scope_exit([&]() {
@@ -484,15 +484,15 @@ class SSAUpdaterImpl {
/// RecordMatchingPHIs - For each PHI node that matches, record it in both
/// the BBMap and the AvailableVals mapping.
- void RecordMatchingPHIs(BlockListTy *BlockList) {
- for (typename BlockListTy::iterator I = BlockList->begin(),
- E = BlockList->end(); I != E; ++I)
- if (PhiT *PHI = (*I)->PHITag) {
- BlkT *BB = PHI->getParent();
- ValT PHIVal = Traits::GetPHIValue(PHI);
- (*AvailableVals)[BB] = PHIVal;
- BBMap[BB]->AvailableVal = PHIVal;
- }
+ void RecordMatchingPHIs(BlockListTy &TaggedBlocks) {
+ for (BBInfo *Block : TaggedBlocks) {
+ PhiT *PHI = Block->PHITag;
+ assert(PHI && "PHITag didn't set?");
+ BlkT *BB = PHI->getParent();
+ ValT PHIVal = Traits::GetPHIValue(PHI);
+ (*AvailableVals)[BB] = PHIVal;
+ BBMap[BB]->AvailableVal = PHIVal;
+ }
}
};
``````````
</details>
https://github.com/llvm/llvm-project/pull/153596
More information about the llvm-commits
mailing list