aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/TargetRegisterInfo.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-09 00:27:27 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-09 00:27:27 +0800
commit6c7cecc81a4c7e06e26027e21edd2cfd95a37a0b (patch)
tree2e39843b9de9c6534c67a768d923788af6292451 /backend/lib/CodeGen/TargetRegisterInfo.cpp
parent77884c967d1cbc48afcbaef7e5a35adcb3c5da1b (diff)
downloadrcc-project-6c7cecc81a4c7e06e26027e21edd2cfd95a37a0b.tar.gz
rcc-project-6c7cecc81a4c7e06e26027e21edd2cfd95a37a0b.tar.xz
[CodeGen] Implement machine liveness analysis
Diffstat (limited to 'backend/lib/CodeGen/TargetRegisterInfo.cpp')
-rw-r--r--backend/lib/CodeGen/TargetRegisterInfo.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/TargetRegisterInfo.cpp b/backend/lib/CodeGen/TargetRegisterInfo.cpp
index 42ae935..7ddf676 100644
--- a/backend/lib/CodeGen/TargetRegisterInfo.cpp
+++ b/backend/lib/CodeGen/TargetRegisterInfo.cpp
@@ -135,6 +135,7 @@ Expected<TargetRegisterInfo> TargetRegisterInfo::create(TargetRegisterInfoDesc D
}
std::unordered_set<RegisterUnitID> ReferencedUnits;
+ std::unordered_map<RegisterUnitID, int> UnitLaneCardinalities;
for (const PhysicalRegisterDesc &Register : Result.Description.PhysicalRegisters) {
if (Register.Units.empty())
return invalidDescription("physical register must reference at least one register unit");
@@ -147,6 +148,12 @@ Expected<TargetRegisterInfo> TargetRegisterInfo::create(TargetRegisterInfoDesc D
return invalidDescription(
"physical register has an unknown, empty-lane, or duplicate register unit");
}
+ const int Cardinality = std::popcount(Unit.Lanes.rawValue());
+ const auto [Position, Inserted] = UnitLaneCardinalities.emplace(Unit.Unit, Cardinality);
+ if (!Inserted && Position->second != Cardinality) {
+ return invalidDescription(
+ "every physical-register view of a register unit must have the same lane count");
+ }
ReferencedUnits.insert(Unit.Unit);
RegisterLanes = RegisterLanes | Unit.Lanes;
}