From f7cf7dcec7325d45b9fe6c73fda77fad6f256006 Mon Sep 17 00:00:00 2001 From: "xumingjie.enna1" 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 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 &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; + } } };