From: Alex Lorenz Date: Wed, 29 Jul 2015 18:51:21 +0000 (+0000) Subject: MIR Parser: Parse multiple LHS register machine operands. X-Git-Tag: studio-1.4~1283 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fbe9c04c5f72cf3eca39793aafc92071ef13c046;p=platform%2Fupstream%2Fllvm.git MIR Parser: Parse multiple LHS register machine operands. llvm-svn: 243553 --- diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 2ef7611..6c0cd9d 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -214,6 +214,8 @@ static const char *toString(MIToken::TokenKind TokenKind) { switch (TokenKind) { case MIToken::comma: return "','"; + case MIToken::equal: + return "'='"; case MIToken::lparen: return "'('"; case MIToken::rparen: @@ -234,18 +236,19 @@ bool MIParser::parse(MachineInstr *&MI) { lex(); // Parse any register operands before '=' - // TODO: Allow parsing of multiple operands before '=' MachineOperand MO = MachineOperand::CreateImm(0); SmallVector Operands; - if (Token.isRegister() || Token.isRegisterFlag()) { + while (Token.isRegister() || Token.isRegisterFlag()) { auto Loc = Token.location(); if (parseRegisterOperand(MO, /*IsDef=*/true)) return true; Operands.push_back(MachineOperandWithLocation(MO, Loc, Token.location())); - if (Token.isNot(MIToken::equal)) - return error("expected '='"); + if (Token.isNot(MIToken::comma)) + break; lex(); } + if (!Operands.empty() && expectAndConsume(MIToken::equal)) + return true; unsigned OpCode, Flags = 0; if (Token.isError() || parseInstruction(OpCode, Flags)) diff --git a/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg b/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg new file mode 100644 index 0000000..f4f77c5 --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/lit.local.cfg @@ -0,0 +1,8 @@ +import re + +if not 'AArch64' in config.root.targets: + config.unsupported = True + +# For now we don't test arm64-win32. +if re.search(r'cygwin|mingw32|win32|windows-gnu|windows-msvc', config.target_triple): + config.unsupported = True diff --git a/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir b/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir new file mode 100644 index 0000000..d47c8ba --- /dev/null +++ b/llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir @@ -0,0 +1,29 @@ +# RUN: llc -mtriple=aarch64-none-linux-gnu -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s +# This test ensures that the MIR parser can parse multiple register machine +# operands before '='. + +--- | + + declare void @foo() + + define void @trivial_fp_func() { + entry: + call void @foo() + ret void + } + +... +--- +name: trivial_fp_func +body: + - id: 0 + name: entry + liveins: [ '%lr', '%fp', '%lr', '%fp' ] + instructions: + - '%sp = frame-setup STPXpre killed %fp, killed %lr, %sp, -2' + - '%fp = frame-setup ADDXri %sp, 0, 0' + - 'BL @foo, csr_aarch64_aapcs, implicit-def dead %lr, implicit %sp, implicit-def %sp' +# CHECK: %sp, %fp, %lr = LDPXpost %sp, 2 + - '%sp, %fp, %lr = LDPXpost %sp, 2' + - RET_ReallyLR +...