aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-11 23:57:49 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-11 23:57:49 +0800
commit2872e39af3aa78b7a54b74d104f133aa715d01cb (patch)
tree168061fb22943a82efbe53c135d0f920a5e1e839 /backend/lib/CodeGen
parente7586a115e9ff6ee303c2546cb0eab48bde6dfbb (diff)
downloadrcc-project-2872e39af3aa78b7a54b74d104f133aa715d01cb.tar.gz
rcc-project-2872e39af3aa78b7a54b74d104f133aa715d01cb.tar.xz
[CodeGen] Treat reserved registers as always live
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/MachineLiveness.cpp11
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());