Index: lib/CodeGen/MIRParser/MIParser.cpp =================================================================== --- lib/CodeGen/MIRParser/MIParser.cpp +++ lib/CodeGen/MIRParser/MIParser.cpp @@ -1002,12 +1002,20 @@ } bool MIParser::parseRegisterClassOrBank(VRegInfo &RegInfo) { + // It is possible a register class or register bank name can be in the form of + // integer of scalar type (e.g. i32). Fix token kind in that case. + auto Range = Token.range(); + if (Token.isNot(MIToken::underscore) && + (PFS.Names2RegClasses.find(Range) != PFS.Names2RegClasses.end() || + PFS.Names2RegBanks.find(Range) != PFS.Names2RegBanks.end())) + Token.reset(MIToken::Identifier, Range).setStringValue(Range); + if (Token.isNot(MIToken::Identifier) && Token.isNot(MIToken::underscore)) return error("expected '_', register class, or register bank name"); StringRef::iterator Loc = Token.location(); - StringRef Name = Token.stringValue(); // Was it a register class? + StringRef Name = Token.stringValue(); auto RCNameI = PFS.Names2RegClasses.find(Name); if (RCNameI != PFS.Names2RegClasses.end()) { lex(); Index: test/CodeGen/MIR/WebAssembly/int-type-register-class-name.mir =================================================================== --- /dev/null +++ test/CodeGen/MIR/WebAssembly/int-type-register-class-name.mir @@ -0,0 +1,13 @@ +# RUN: llc -mtriple=wasm32-unknown-unknown-wasm -run-pass none -o - %s | FileCheck %s +# When a register class has a name of an integer type (i32) +--- +name: regclass_name_test +liveins: + - { reg: '$arguments' } +body: | + bb.0: + liveins: $arguments + %0:i32 = CONST_I32 0, implicit-def dead $arguments + ; CHECK: %0:i32 = CONST_I32 0, implicit-def dead $arguments + RETURN_VOID implicit-def dead $arguments +... Index: test/CodeGen/MIR/WebAssembly/lit.local.cfg =================================================================== --- /dev/null +++ test/CodeGen/MIR/WebAssembly/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'WebAssembly' in config.root.targets: + config.unsupported = True