[llvm] [SSAUpdater] Only iterate blocks modified by CheckIfPHIMatches() in ordMatchingPHIs() (PR #153596)
Mingjie Xu via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 14 08:21:51 PDT 2025
https://github.com/Enna1 created https://github.com/llvm/llvm-project/pull/153596
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.
>From f7cf7dcec7325d45b9fe6c73fda77fad6f256006 Mon Sep 17 00:00:00 2001
From: "xumingjie.enna1" <xumingjie.enna1 at bytedance.com>
Date: Thu, 14 Aug 2025 20:06:15 +0800
Subject: [PATCH] [SSAUpdater] Only iterate blocks modified by
CheckIfPHIMatches in RecordMatchingPHIs
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.
---
.../llvm/Transforms/Utils/SSAUpdaterImpl.h | 26 +++++++++----------
1 file changed, 13 insertions(+), 13 deletions(-)
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;
+ }
}
};
More information about the llvm-commits
mailing list