[llvm] [LiveRegUnits] Avoid accidentally O(n^2) loop in addCalleeSavedRegs (NFC) (PR #214740)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 7 07:41:29 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-regalloc

Author: Benjamin Maxwell (MacDue)

<details>
<summary>Changes</summary>

This is a small improvement for `stage1-aarch64-O3`: https://llvm-compile-time-tracker.com/compare.php?from=94af8651da4a1b907a8ea2acb698d72aad3df722&to=ce67ef155e8fc7945a6ec930a12e5762a45fa00b&stat=instructions:u

---
Full diff: https://github.com/llvm/llvm-project/pull/214740.diff


1 Files Affected:

- (modified) llvm/lib/CodeGen/LiveRegUnits.cpp (+9-12) 


``````````diff
diff --git a/llvm/lib/CodeGen/LiveRegUnits.cpp b/llvm/lib/CodeGen/LiveRegUnits.cpp
index 6ff4ef1c95e41..9cec1a9378fca 100644
--- a/llvm/lib/CodeGen/LiveRegUnits.cpp
+++ b/llvm/lib/CodeGen/LiveRegUnits.cpp
@@ -105,17 +105,8 @@ static void addBlockLiveOuts(LiveRegUnits &LiveUnits,
 static void addCalleeSavedRegs(LiveRegUnits &LiveUnits,
                                const MachineFunction &MF) {
   const MachineRegisterInfo &MRI = MF.getRegInfo();
-  const MachineFrameInfo &MFI = MF.getFrameInfo();
-  for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR) {
-    const unsigned N = *CSR;
-
-    const auto &CSI = MFI.getCalleeSavedInfo();
-    auto Info =
-        llvm::find_if(CSI, [N](auto Info) { return Info.getReg() == N; });
-    // If we have no info for this callee-saved register, assume it is liveout
-    if (Info == CSI.end() || Info->isRestored())
-      LiveUnits.addReg(N);
-  }
+  for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
+    LiveUnits.addReg(*CSR);
 }
 
 void LiveRegUnits::addPristines(const MachineFunction &MF) {
@@ -153,8 +144,14 @@ void LiveRegUnits::addLiveOuts(const MachineBasicBlock &MBB) {
   // For the return block: Add all callee saved registers.
   if (MBB.isReturnBlock()) {
     const MachineFrameInfo &MFI = MF.getFrameInfo();
-    if (MFI.isCalleeSavedInfoValid())
+    if (MFI.isCalleeSavedInfoValid()) {
       addCalleeSavedRegs(*this, MF);
+      // We assume callee-saved registers without CalleeSavedInfo are liveout.
+      for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo()) {
+        if (!Info.isRestored())
+          removeReg(Info.getReg());
+      }
+    }
   }
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/214740


More information about the llvm-commits mailing list