[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