diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-11 23:57:49 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-11 23:57:49 +0800 |
| commit | 2872e39af3aa78b7a54b74d104f133aa715d01cb (patch) | |
| tree | 168061fb22943a82efbe53c135d0f920a5e1e839 /backend/lib/CodeGen/MachineLiveness.cpp | |
| parent | e7586a115e9ff6ee303c2546cb0eab48bde6dfbb (diff) | |
| download | rcc-project-2872e39af3aa78b7a54b74d104f133aa715d01cb.tar.gz rcc-project-2872e39af3aa78b7a54b74d104f133aa715d01cb.tar.xz | |
[CodeGen] Treat reserved registers as always live
Diffstat (limited to 'backend/lib/CodeGen/MachineLiveness.cpp')
| -rw-r--r-- | backend/lib/CodeGen/MachineLiveness.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/MachineLiveness.cpp b/backend/lib/CodeGen/MachineLiveness.cpp index 9ed09cc..528a675 100644 --- a/backend/lib/CodeGen/MachineLiveness.cpp +++ b/backend/lib/CodeGen/MachineLiveness.cpp @@ -239,6 +239,13 @@ void addPhysicalRegister(RegisterUnitLaneSet &Set, const PhysicalRegisterDesc &D Set.unite(physicalRegisterCoverage(Description, Requested)); } +[[nodiscard]] bool isReservedPhysicalRegister(Register Reg, const MachineFunction &Function, + const TargetDescription &Target) noexcept { + const std::optional<PhysicalRegister> Physical = Reg.physicalRegister(); + return Physical && (Function.registerInfo().isReserved(*Physical) || + Target.registers().isReservedRegister(*Physical)); +} + [[nodiscard]] Expected<void> addRegisterMaskDefs(RegisterUnitLaneSet &Set, const RegisterMask &Mask, const TargetDescription &Target) { for (const PhysicalRegisterDesc &Description : Target.registers().physicalRegisters()) { @@ -274,6 +281,8 @@ void addPhysicalRegister(RegisterUnitLaneSet &Set, const PhysicalRegisterDesc &D VirtualUses.add(*Reg, *Lanes); return {}; } + if (isReservedPhysicalRegister(*Reg, Function, Target)) + return {}; auto Units = physicalOperandUnits(Operand, Target); if (!Units) return std::unexpected(Units.error()); @@ -851,6 +860,8 @@ struct LivenessRebuildPlan final { return std::unexpected(Lanes.error()); return Virtual.intersects(*Reg, *Lanes); } + if (isReservedPhysicalRegister(*Reg, Function, Target)) + return true; auto Units = physicalOperandUnits(Operand, Target); if (!Units) return std::unexpected(Units.error()); |
