[llvm] r240558 - MIR Serialization: Serialize the null register operands.

Alex Lorenz arphaman at gmail.com
Wed Jun 24 10:34:58 PDT 2015


Author: arphaman
Date: Wed Jun 24 12:34:58 2015
New Revision: 240558

URL: http://llvm.org/viewvc/llvm-project?rev=240558&view=rev
Log:
MIR Serialization: Serialize the null register operands.

This commit serializes the null register machine operands.
It uses the '_' keyword to represent them, but the parser
also allows the '%noreg' named register syntax.

Reviewers: Duncan P. N. Exon Smith

Differential Revision: http://reviews.llvm.org/D10580

Added:
    llvm/trunk/test/CodeGen/MIR/X86/null-register-operands.mir
Modified:
    llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp
    llvm/trunk/lib/CodeGen/MIRParser/MILexer.h
    llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp
    llvm/trunk/lib/CodeGen/MIRPrinter.cpp

Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp?rev=240558&r1=240557&r2=240558&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp Wed Jun 24 12:34:58 2015
@@ -64,7 +64,9 @@ static Cursor lexIdentifier(Cursor C, MI
   auto Range = C;
   while (isIdentifierChar(C.peek()))
     C.advance();
-  Token = MIToken(MIToken::Identifier, Range.upto(C));
+  auto Identifier = Range.upto(C);
+  Token = MIToken(Identifier == "_" ? MIToken::underscore : MIToken::Identifier,
+                  Identifier);
   return C;
 }
 

Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.h?rev=240558&r1=240557&r2=240558&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.h (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.h Wed Jun 24 12:34:58 2015
@@ -34,6 +34,7 @@ struct MIToken {
     // Tokens with no info.
     comma,
     equal,
+    underscore,
 
     // Identifier tokens
     Identifier,
@@ -58,7 +59,9 @@ public:
 
   bool isError() const { return Kind == Error; }
 
-  bool isRegister() const { return Kind == NamedRegister; }
+  bool isRegister() const {
+    return Kind == NamedRegister || Kind == underscore;
+  }
 
   bool is(TokenKind K) const { return Kind == K; }
 

Modified: llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp?rev=240558&r1=240557&r2=240558&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp Wed Jun 24 12:34:58 2015
@@ -174,6 +174,9 @@ bool MIParser::parseInstruction(unsigned
 
 bool MIParser::parseRegister(unsigned &Reg) {
   switch (Token.kind()) {
+  case MIToken::underscore:
+    Reg = 0;
+    break;
   case MIToken::NamedRegister: {
     StringRef Name = Token.stringValue().drop_front(1); // Drop the '%'
     if (getRegisterByName(Name, Reg))
@@ -211,6 +214,7 @@ bool MIParser::parseImmediateOperand(Mac
 
 bool MIParser::parseMachineOperand(MachineOperand &Dest) {
   switch (Token.kind()) {
+  case MIToken::underscore:
   case MIToken::NamedRegister:
     return parseRegisterOperand(Dest);
   case MIToken::IntegerLiteral:
@@ -245,6 +249,8 @@ bool MIParser::parseInstrName(StringRef
 void MIParser::initNames2Regs() {
   if (!Names2Regs.empty())
     return;
+  // The '%noreg' register is the register 0.
+  Names2Regs.insert(std::make_pair("noreg", 0));
   const auto *TRI = MF.getSubtarget().getRegisterInfo();
   assert(TRI && "Expected target register info");
   for (unsigned I = 0, E = TRI->getNumRegs(); I < E; ++I) {

Modified: llvm/trunk/lib/CodeGen/MIRPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRPrinter.cpp?rev=240558&r1=240557&r2=240558&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRPrinter.cpp Wed Jun 24 12:34:58 2015
@@ -144,9 +144,10 @@ void MIPrinter::print(const MachineInstr
 static void printReg(unsigned Reg, raw_ostream &OS,
                      const TargetRegisterInfo *TRI) {
   // TODO: Print Stack Slots.
-  // TODO: Print no register.
   // TODO: Print virtual registers.
-  if (Reg < TRI->getNumRegs())
+  if (!Reg)
+    OS << '_';
+  else if (Reg < TRI->getNumRegs())
     OS << '%' << StringRef(TRI->getName(Reg)).lower();
   else
     llvm_unreachable("Can't print this kind of register yet");

Added: llvm/trunk/test/CodeGen/MIR/X86/null-register-operands.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/null-register-operands.mir?rev=240558&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/MIR/X86/null-register-operands.mir (added)
+++ llvm/trunk/test/CodeGen/MIR/X86/null-register-operands.mir Wed Jun 24 12:34:58 2015
@@ -0,0 +1,23 @@
+# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
+# This test ensures that the MIR parser parses null register operands correctly.
+
+--- |
+
+  define i32 @deref(i32* %p) {
+  entry:
+    %a = load i32, i32* %p
+    ret i32 %a
+  }
+
+...
+---
+# CHECK: name: deref
+name:            deref
+body:
+ - name:         entry
+   instructions:
+     # CHECK:      - '%eax = MOV32rm %rdi, 1, _, 0, _'
+     # CHECK-NEXT: - 'RETQ %eax'
+     - '%eax = MOV32rm %rdi, 1, _, 0, %noreg'
+     - 'RETQ %eax'
+...





More information about the llvm-commits mailing list