[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