MIR Parser: Parse multiple LHS register machine operands.
authorAlex Lorenz <arphaman@gmail.com>
Wed, 29 Jul 2015 18:51:21 +0000 (18:51 +0000)
committerAlex Lorenz <arphaman@gmail.com>
Wed, 29 Jul 2015 18:51:21 +0000 (18:51 +0000)
llvm-svn: 243553

llvm/lib/CodeGen/MIRParser/MIParser.cpp
llvm/test/CodeGen/MIR/AArch64/lit.local.cfg [new file with mode: 0644]
llvm/test/CodeGen/MIR/AArch64/multiple-lhs-operands.mir [new file with mode: 0644]

index 2ef7611..6c0cd9d 100644 (file)
@@ -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<MachineOperandWithLocation, 8> 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 (file)
index 0000000..f4f77c5
--- /dev/null
@@ -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 (file)
index 0000000..d47c8ba
--- /dev/null
@@ -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
+...