https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/230151
>From 4d7984d2063ec9838c5e876b6dfddf20563d76cb Mon Sep 17 00:00:00 2001 From: Matt Arsenault <[email protected]> Date: Thu, 8 Oct 2026 16:27:33 +0200 Subject: [PATCH] LiveVariables: Only visit tracked physical registers Keep a bitvector of physical registers with a recorded def or use in the current block. Register mask handling, the end of block scan, and the per-block reset now only visit those registers instead of every register. This is significant for targets with many registers, such as AMDGPU. Co-authored-by: Claude Opus 5.5 <[email protected]> --- llvm/include/llvm/CodeGen/LiveVariables.h | 3 +++ llvm/lib/CodeGen/LiveVariables.cpp | 27 ++++++++++++++++------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/CodeGen/LiveVariables.h b/llvm/include/llvm/CodeGen/LiveVariables.h index 94a85e1c87bfd..9f2601c75e0cf 100644 --- a/llvm/include/llvm/CodeGen/LiveVariables.h +++ b/llvm/include/llvm/CodeGen/LiveVariables.h @@ -15,6 +15,7 @@ #ifndef LLVM_CODEGEN_LIVEVARIABLES_H #define LLVM_CODEGEN_LIVEVARIABLES_H +#include "llvm/ADT/BitVector.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -46,6 +47,8 @@ class LiveVariables { // register references are presumed dead across basic blocks. std::vector<MachineInstr *> PhysRegUse; + BitVector TrackedRegs; + // DistanceMap - Keep track the distance of a MI from the start of the // current basic block. DenseMap<MachineInstr*, unsigned> DistanceMap; diff --git a/llvm/lib/CodeGen/LiveVariables.cpp b/llvm/lib/CodeGen/LiveVariables.cpp index 8546ccad1dcb1..7ef2addc2e85e 100644 --- a/llvm/lib/CodeGen/LiveVariables.cpp +++ b/llvm/lib/CodeGen/LiveVariables.cpp @@ -99,8 +99,10 @@ void LiveVariables::HandlePhysRegUse(Register Reg, MachineInstr &MI) { true/*IsImp*/)); // Remember this use. - for (MCPhysReg SubReg : TRI->subregs_inclusive(Reg)) + for (MCPhysReg SubReg : TRI->subregs_inclusive(Reg)) { PhysRegUse[SubReg] = &MI; + TrackedRegs.set(SubReg); + } } /// FindLastRefOrPartRef - Return the last reference or partial reference of @@ -201,8 +203,10 @@ void LiveVariables::HandlePhysRegKill(Register Reg, MachineInstr *MI) { PhysRegDef[Reg.id()]->addOperand( MachineOperand::CreateReg(SubReg, true /*IsDef*/, true /*IsImp*/)); if (!FindLastRefOrPartRef(SubReg)) { - for (MCPhysReg SS : TRI->subregs_inclusive(SubReg)) + for (MCPhysReg SS : TRI->subregs_inclusive(SubReg)) { PhysRegUse[SS] = LastRefOrPartRef; + TrackedRegs.set(SS); + } } for (MCPhysReg SS : TRI->subregs(SubReg)) PartUses.erase(SS); @@ -229,7 +233,7 @@ void LiveVariables::HandleRegMask(const MachineOperand &MO, unsigned NumRegs) { // Call HandlePhysRegKill() for all live registers clobbered by Mask. // Clobbered registers are always dead, sp there is no need to use // HandlePhysRegDef(). - for (unsigned Reg = 1; Reg != NumRegs; ++Reg) { + for (unsigned Reg : TrackedRegs.set_bits()) { // Skip dead regs. if (!PhysRegDef[Reg] && !PhysRegUse[Reg]) continue; @@ -285,6 +289,7 @@ void LiveVariables::UpdatePhysRegDefs(MachineInstr &MI, for (MCPhysReg SubReg : TRI->subregs_inclusive(Reg)) { PhysRegDef[SubReg] = &MI; PhysRegUse[SubReg] = nullptr; + TrackedRegs.set(SubReg); } } } @@ -358,9 +363,9 @@ void LiveVariables::runOnBlock(MachineBasicBlock *MBB, unsigned NumRegs) { // Loop over PhysRegDef / PhysRegUse, killing any registers that are // available at the end of the basic block. - for (unsigned i = 0; i != NumRegs; ++i) - if ((PhysRegDef[i] || PhysRegUse[i]) && !LiveOuts.count(i)) - HandlePhysRegDef(i, nullptr); + for (unsigned Reg : TrackedRegs.set_bits()) + if ((PhysRegDef[Reg] || PhysRegUse[Reg]) && !LiveOuts.count(Reg)) + HandlePhysRegDef(Reg, nullptr); } void LiveVariables::analyze(MachineFunction &mf) { @@ -376,12 +381,17 @@ void LiveVariables::analyze(MachineFunction &mf) { const unsigned NumRegs = TRI->getNumSupportedRegs(mf); PhysRegDef.assign(NumRegs, nullptr); PhysRegUse.assign(NumRegs, nullptr); + TrackedRegs.clear(); + TrackedRegs.resize(NumRegs); for (MachineBasicBlock &MBB : mf) { runOnBlock(&MBB, NumRegs); - PhysRegDef.assign(NumRegs, nullptr); - PhysRegUse.assign(NumRegs, nullptr); + for (unsigned Reg : TrackedRegs.set_bits()) { + PhysRegDef[Reg] = nullptr; + PhysRegUse[Reg] = nullptr; + } + TrackedRegs.reset(); } for (unsigned I = 0, E = MRI->getNumVirtRegs(); I != E; ++I) { @@ -394,4 +404,5 @@ void LiveVariables::analyze(MachineFunction &mf) { PhysRegDef.clear(); PhysRegUse.clear(); + TrackedRegs.clear(); } _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
