aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/MIR/MIParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/MIR/MIParser.cpp')
-rw-r--r--backend/lib/MIR/MIParser.cpp11
1 files changed, 9 insertions, 2 deletions
diff --git a/backend/lib/MIR/MIParser.cpp b/backend/lib/MIR/MIParser.cpp
index ecf4986..483c2f2 100644
--- a/backend/lib/MIR/MIParser.cpp
+++ b/backend/lib/MIR/MIParser.cpp
@@ -1098,14 +1098,21 @@ bool MIParser::Impl::parseRegisterOperand(bool IsDef, ParsedOperand &Result) {
} else if (at(MITokenKind::Identifier)) {
if (const RegisterClassDesc *Class =
Target.registers().registerClass(token().stringValue())) {
- if ((Info.RegClass && *Info.RegClass != Class->ID) || Info.Bank)
+ if ((Info.RegClass && *Info.RegClass != Class->ID) ||
+ (Info.Bank && *Info.Bank != Class->DefaultBank))
return fail("conflicting virtual register class");
auto SetClass = Function.registerInfo().setRegisterClass(Reg, Class->ID);
if (!SetClass)
return importError(token(), SetClass.error());
+ auto SetBank = Function.registerInfo().setRegisterBank(Reg, Class->DefaultBank);
+ if (!SetBank)
+ return importError(token(), SetBank.error());
} else if (const RegisterBankDesc *Bank =
Target.registers().registerBank(token().stringValue())) {
- if ((Info.Bank && *Info.Bank != Bank->ID) || Info.RegClass)
+ const RegisterClassDesc *ExistingClass =
+ Info.RegClass ? Target.registers().registerClass(*Info.RegClass) : nullptr;
+ if ((Info.Bank && *Info.Bank != Bank->ID) ||
+ (Info.RegClass && (ExistingClass == nullptr || ExistingClass->DefaultBank != Bank->ID)))
return fail("conflicting virtual register bank");
auto SetBank = Function.registerInfo().setRegisterBank(Reg, Bank->ID);
if (!SetBank)