diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-09 00:27:27 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-09 00:27:27 +0800 |
| commit | 6c7cecc81a4c7e06e26027e21edd2cfd95a37a0b (patch) | |
| tree | 2e39843b9de9c6534c67a768d923788af6292451 /backend/lib/CodeGen/TargetRegisterInfo.cpp | |
| parent | 77884c967d1cbc48afcbaef7e5a35adcb3c5da1b (diff) | |
| download | rcc-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.cpp | 7 |
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; } |
