aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen/TargetRegisterInfo.cpp
diff options
context:
space:
mode:
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;
}