[llvm] [NFC] Remove goto in PromoteMem2Reg::RenamePass (PR #142454)

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 2 11:35:23 PDT 2025


https://github.com/vitalybuka created https://github.com/llvm/llvm-project/pull/142454

'goto' is essentially a shortcut for push/pop for worklist.
It can be expensive if we copy vectors, but if we move them, it should
be an issue.

Without 'goto' it's easier to reason about the
code, and it `PromoteMem2Reg::RenamePass` process
exactly one edge at a time.

There is out of order processing of the first
successor, just to make this path pure NFC. I'll
remove this in follow up patch.


>From cfcec3b61ddd3f2cb8168d88d2bcbe71635d2ac2 Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Mon, 2 Jun 2025 11:35:08 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.6
---
 .../Utils/PromoteMemoryToRegister.cpp         | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
index 6ba64968193cf..d84b07bd1457c 100644
--- a/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
+++ b/llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
@@ -424,8 +424,8 @@ struct PromoteMem2Reg {
                            const SmallPtrSetImpl<BasicBlock *> &DefBlocks,
                            SmallPtrSetImpl<BasicBlock *> &LiveInBlocks);
   void RenamePass(BasicBlock *BB, BasicBlock *Pred,
-                  RenamePassData::ValVector &IncVals,
-                  RenamePassData::LocationVector &IncLocs,
+                  RenamePassData::ValVector IncVals,
+                  RenamePassData::LocationVector IncLocs,
                   std::vector<RenamePassData> &Worklist);
   bool QueuePhiNode(BasicBlock *BB, unsigned AllocaIdx, unsigned &Version);
 
@@ -869,7 +869,8 @@ void PromoteMem2Reg::run() {
     RenamePassData RPD = std::move(RenamePassWorkList.back());
     RenamePassWorkList.pop_back();
     // RenamePass may add new worklist entries.
-    RenamePass(RPD.BB, RPD.Pred, RPD.Values, RPD.Locations, RenamePassWorkList);
+    RenamePass(RPD.BB, RPD.Pred, std::move(RPD.Values),
+               std::move(RPD.Locations), RenamePassWorkList);
   } while (!RenamePassWorkList.empty());
 
   // Remove the allocas themselves from the function.
@@ -1096,10 +1097,9 @@ static void updateForIncomingValueLocation(PHINode *PN, DebugLoc DL,
 /// IncomingVals indicates what value each Alloca contains on exit from the
 /// predecessor block Pred.
 void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred,
-                                RenamePassData::ValVector &IncomingVals,
-                                RenamePassData::LocationVector &IncomingLocs,
+                                RenamePassData::ValVector IncomingVals,
+                                RenamePassData::LocationVector IncomingLocs,
                                 std::vector<RenamePassData> &Worklist) {
-NextIteration:
   // If we are inserting any phi nodes into this BB, they will already be in the
   // block.
   if (PHINode *APN = dyn_cast<PHINode>(BB->begin())) {
@@ -1222,17 +1222,17 @@ void PromoteMem2Reg::RenamePass(BasicBlock *BB, BasicBlock *Pred,
   // Keep track of the successors so we don't visit the same successor twice
   SmallPtrSet<BasicBlock *, 8> VisitedSuccs;
 
-  // Handle the first successor without using the worklist.
+  // Handle the first successor after the rest, to mimic legacy behaviour.
+  // FIXME: Handle them in regular order.
   VisitedSuccs.insert(*I);
-  Pred = BB;
-  BB = *I;
   ++I;
 
   for (; I != E; ++I)
     if (VisitedSuccs.insert(*I).second)
-      Worklist.emplace_back(*I, Pred, IncomingVals, IncomingLocs);
+      Worklist.emplace_back(*I, BB, IncomingVals, IncomingLocs);
 
-  goto NextIteration;
+  Worklist.emplace_back(*succ_begin(BB), BB, std::move(IncomingVals),
+                        std::move(IncomingLocs));
 }
 
 void llvm::PromoteMemToReg(ArrayRef<AllocaInst *> Allocas, DominatorTree &DT,



More information about the llvm-commits mailing list