[llvm] r242358 - MIR Serialization: Serialize the jump table index operands.

Alex Lorenz arphaman at gmail.com
Wed Jul 15 16:38:36 PDT 2015


Author: arphaman
Date: Wed Jul 15 18:38:35 2015
New Revision: 242358

URL: http://llvm.org/viewvc/llvm-project?rev=242358&view=rev
Log:
MIR Serialization: Serialize the jump table index operands.

Reviewers: Duncan P. N. Exon Smith

Added:
    llvm/trunk/test/CodeGen/MIR/X86/undefined-jump-table-id.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/MIRParser/MIParser.h
    llvm/trunk/lib/CodeGen/MIRParser/MIRParser.cpp
    llvm/trunk/lib/CodeGen/MIRPrinter.cpp
    llvm/trunk/test/CodeGen/MIR/X86/jump-table-info.mir

Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.cpp Wed Jul 15 18:38:35 2015
@@ -115,6 +115,23 @@ static Cursor maybeLexMachineBasicBlock(
   return C;
 }
 
+static Cursor maybeLexIndex(Cursor C, MIToken &Token, StringRef Rule,
+                            MIToken::TokenKind Kind) {
+  if (!C.remaining().startswith(Rule) || !isdigit(C.peek(Rule.size())))
+    return None;
+  auto Range = C;
+  C.advance(Rule.size());
+  auto NumberRange = C;
+  while (isdigit(C.peek()))
+    C.advance();
+  Token = MIToken(Kind, Range.upto(C), APSInt(NumberRange.upto(C)));
+  return C;
+}
+
+static Cursor maybeLexJumpTableIndex(Cursor C, MIToken &Token) {
+  return maybeLexIndex(C, Token, "%jump-table.", MIToken::JumpTableIndex);
+}
+
 static Cursor lexVirtualRegister(Cursor C, MIToken &Token) {
   auto Range = C;
   C.advance(); // Skip '%'
@@ -209,6 +226,8 @@ StringRef llvm::lexMIToken(
     return R.remaining();
   if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback))
     return R.remaining();
+  if (Cursor R = maybeLexJumpTableIndex(C, Token))
+    return R.remaining();
   if (Cursor R = maybeLexRegister(C, Token))
     return R.remaining();
   if (Cursor R = maybeLexGlobalValue(C, Token))

Modified: llvm/trunk/lib/CodeGen/MIRParser/MILexer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MILexer.h?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MILexer.h (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MILexer.h Wed Jul 15 18:38:35 2015
@@ -53,7 +53,8 @@ struct MIToken {
 
     // Other tokens
     IntegerLiteral,
-    VirtualRegister
+    VirtualRegister,
+    JumpTableIndex
   };
 
 private:
@@ -96,7 +97,8 @@ public:
 
   bool hasIntegerValue() const {
     return Kind == IntegerLiteral || Kind == MachineBasicBlock ||
-           Kind == GlobalValue || Kind == VirtualRegister;
+           Kind == GlobalValue || Kind == VirtualRegister ||
+           Kind == JumpTableIndex;
   }
 };
 

Modified: llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MIParser.cpp Wed Jul 15 18:38:35 2015
@@ -88,6 +88,7 @@ public:
   bool parseMBBReference(MachineBasicBlock *&MBB);
   bool parseMBBOperand(MachineOperand &Dest);
   bool parseGlobalAddressOperand(MachineOperand &Dest);
+  bool parseJumpTableIndexOperand(MachineOperand &Dest);
   bool parseMachineOperand(MachineOperand &Dest);
 
 private:
@@ -468,6 +469,20 @@ bool MIParser::parseGlobalAddressOperand
   return false;
 }
 
+bool MIParser::parseJumpTableIndexOperand(MachineOperand &Dest) {
+  assert(Token.is(MIToken::JumpTableIndex));
+  unsigned ID;
+  if (getUnsigned(ID))
+    return true;
+  auto JumpTableEntryInfo = PFS.JumpTableSlots.find(ID);
+  if (JumpTableEntryInfo == PFS.JumpTableSlots.end())
+    return error("use of undefined jump table '%jump-table." + Twine(ID) + "'");
+  lex();
+  // TODO: Parse target flags.
+  Dest = MachineOperand::CreateJTI(JumpTableEntryInfo->second);
+  return false;
+}
+
 bool MIParser::parseMachineOperand(MachineOperand &Dest) {
   switch (Token.kind()) {
   case MIToken::kw_implicit:
@@ -486,6 +501,8 @@ bool MIParser::parseMachineOperand(Machi
   case MIToken::GlobalValue:
   case MIToken::NamedGlobalValue:
     return parseGlobalAddressOperand(Dest);
+  case MIToken::JumpTableIndex:
+    return parseJumpTableIndexOperand(Dest);
   case MIToken::Error:
     return true;
   case MIToken::Identifier:

Modified: llvm/trunk/lib/CodeGen/MIRParser/MIParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIParser.h?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MIParser.h (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MIParser.h Wed Jul 15 18:38:35 2015
@@ -29,6 +29,7 @@ class SourceMgr;
 struct PerFunctionMIParsingState {
   DenseMap<unsigned, MachineBasicBlock *> MBBSlots;
   DenseMap<unsigned, unsigned> VirtualRegisterSlots;
+  DenseMap<unsigned, unsigned> JumpTableSlots;
 };
 
 bool parseMachineInstr(MachineInstr *&MI, SourceMgr &SM, MachineFunction &MF,

Modified: llvm/trunk/lib/CodeGen/MIRParser/MIRParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRParser/MIRParser.cpp?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRParser/MIRParser.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRParser/MIRParser.cpp Wed Jul 15 18:38:35 2015
@@ -113,7 +113,7 @@ public:
 
   bool initializeJumpTableInfo(MachineFunction &MF,
                                const yaml::MachineJumpTable &YamlJTI,
-                               const PerFunctionMIParsingState &PFS);
+                               PerFunctionMIParsingState &PFS);
 
 private:
   /// Return a MIR diagnostic converted from an MI string diagnostic.
@@ -436,7 +436,7 @@ bool MIRParserImpl::initializeFrameInfo(
 
 bool MIRParserImpl::initializeJumpTableInfo(
     MachineFunction &MF, const yaml::MachineJumpTable &YamlJTI,
-    const PerFunctionMIParsingState &PFS) {
+    PerFunctionMIParsingState &PFS) {
   MachineJumpTableInfo *JTI = MF.getOrCreateJumpTableInfo(YamlJTI.Kind);
   SMDiagnostic Error;
   for (const auto &Entry : YamlJTI.Entries) {
@@ -447,7 +447,9 @@ bool MIRParserImpl::initializeJumpTableI
         return error(Error, MBBSource.SourceRange);
       Blocks.push_back(MBB);
     }
-    JTI->createJumpTableIndex(Blocks);
+    unsigned Index = JTI->createJumpTableIndex(Blocks);
+    // TODO: Report an error when the same jump table slot ID is redefined.
+    PFS.JumpTableSlots.insert(std::make_pair(Entry.ID, Index));
   }
   return false;
 }

Modified: llvm/trunk/lib/CodeGen/MIRPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MIRPrinter.cpp?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/MIRPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/MIRPrinter.cpp Wed Jul 15 18:38:35 2015
@@ -350,6 +350,10 @@ void MIPrinter::print(const MachineOpera
   case MachineOperand::MO_MachineBasicBlock:
     printMBBReference(*Op.getMBB());
     break;
+  case MachineOperand::MO_JumpTableIndex:
+    OS << "%jump-table." << Op.getIndex();
+    // TODO: Print target flags.
+    break;
   case MachineOperand::MO_GlobalAddress:
     Op.getGlobal()->printAsOperand(OS, /*PrintType=*/false, MST);
     // TODO: Print offset and target flags.

Modified: llvm/trunk/test/CodeGen/MIR/X86/jump-table-info.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/jump-table-info.mir?rev=242358&r1=242357&r2=242358&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/MIR/X86/jump-table-info.mir (original)
+++ llvm/trunk/test/CodeGen/MIR/X86/jump-table-info.mir Wed Jul 15 18:38:35 2015
@@ -1,5 +1,6 @@
 # RUN: llc -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
-# This test ensures that the MIR parser parses the jump table info correctly.
+# This test ensures that the MIR parser parses the jump table info and jump
+# table operands correctly.
 
 --- |
 
@@ -28,6 +29,31 @@
     ret i32 8
   }
 
+  define i32 @test_jumptable2(i32 %in) {
+  entry:
+    switch i32 %in, label %def [
+      i32 0, label %lbl1
+      i32 1, label %lbl2
+      i32 2, label %lbl3
+      i32 3, label %lbl4
+    ]
+
+  def:
+    ret i32 0
+
+  lbl1:
+    ret i32 1
+
+  lbl2:
+    ret i32 2
+
+  lbl3:
+    ret i32 4
+
+  lbl4:
+    ret i32 8
+  }
+
 ...
 ---
 name:            test_jumptable
@@ -46,17 +72,93 @@ body:
   - id:          0
     name:        entry
     successors:  [ '%bb.2.def', '%bb.1.entry' ]
+    instructions:
+      - '%eax = MOV32rr %edi, implicit-def %rax'
+      - 'CMP32ri8 %edi, 3, implicit-def %eflags'
+      - 'JA_1 %bb.2.def, implicit %eflags'
   - id:          1
     name:        entry
     successors:  [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
+    instructions:
+    # CHECK: %rcx = LEA64r %rip, 1, _, %jump-table.0, _
+      - '%rcx = LEA64r %rip, 1, _, %jump-table.0, _'
+      - '%rax = MOVSX64rm32 %rcx, 4, %rax, 0, _'
+      - '%rax = ADD64rr %rax, %rcx, implicit-def %eflags'
+      - 'JMP64r %rax'
   - id:          2
     name:        def
+    instructions:
+      - '%eax = MOV32r0 implicit-def %eflags'
+      - 'RETQ %eax'
   - id:          3
     name:        lbl1
+    instructions:
+      - '%eax = MOV32ri 1'
+      - 'RETQ %eax'
   - id:          4
     name:        lbl2
+    instructions:
+      - '%eax = MOV32ri 2'
+      - 'RETQ %eax'
   - id:          5
     name:        lbl3
+    instructions:
+      - '%eax = MOV32ri 4'
+      - 'RETQ %eax'
   - id:          6
     name:        lbl4
+    instructions:
+      - '%eax = MOV32ri 8'
+      - 'RETQ %eax'
+...
+---
+name:            test_jumptable2
+jumpTable:
+  kind:          label-difference32
+  entries:
+    - id:        1
+      blocks:    [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
+body:
+  - id:          0
+    name:        entry
+    successors:  [ '%bb.2.def', '%bb.1.entry' ]
+    instructions:
+      - '%eax = MOV32rr %edi, implicit-def %rax'
+      - 'CMP32ri8 %edi, 3, implicit-def %eflags'
+      - 'JA_1 %bb.2.def, implicit %eflags'
+  - id:          1
+    name:        entry
+    successors:  [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
+    instructions:
+    # Verify that the printer will use an id of 0 for this jump table:
+    # CHECK: %rcx = LEA64r %rip, 1, _, %jump-table.0, _
+      - '%rcx = LEA64r %rip, 1, _, %jump-table.1, _'
+      - '%rax = MOVSX64rm32 %rcx, 4, %rax, 0, _'
+      - '%rax = ADD64rr %rax, %rcx, implicit-def %eflags'
+      - 'JMP64r %rax'
+  - id:         2
+    name:       def
+    instructions:
+      - '%eax = MOV32r0 implicit-def %eflags'
+      - 'RETQ %eax'
+  - id:         3
+    name:       lbl1
+    instructions:
+      - '%eax = MOV32ri 1'
+      - 'RETQ %eax'
+  - id:         4
+    name:       lbl2
+    instructions:
+      - '%eax = MOV32ri 2'
+      - 'RETQ %eax'
+  - id:         5
+    name:       lbl3
+    instructions:
+      - '%eax = MOV32ri 4'
+      - 'RETQ %eax'
+  - id:         6
+    name:       lbl4
+    instructions:
+      - '%eax = MOV32ri 8'
+      - 'RETQ %eax'
 ...

Added: llvm/trunk/test/CodeGen/MIR/X86/undefined-jump-table-id.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/MIR/X86/undefined-jump-table-id.mir?rev=242358&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/MIR/X86/undefined-jump-table-id.mir (added)
+++ llvm/trunk/test/CodeGen/MIR/X86/undefined-jump-table-id.mir Wed Jul 15 18:38:35 2015
@@ -0,0 +1,80 @@
+# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s
+
+--- |
+
+  define i32 @test_jumptable(i32 %in) {
+  entry:
+    switch i32 %in, label %def [
+      i32 0, label %lbl1
+      i32 1, label %lbl2
+      i32 2, label %lbl3
+      i32 3, label %lbl4
+    ]
+
+  def:
+    ret i32 0
+
+  lbl1:
+    ret i32 1
+
+  lbl2:
+    ret i32 2
+
+  lbl3:
+    ret i32 4
+
+  lbl4:
+    ret i32 8
+  }
+
+...
+---
+name:            test_jumptable
+jumpTable:
+  kind:          label-difference32
+  entries:
+    - id:        0
+      blocks:    [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
+body:
+  - id:              0
+    name:            entry
+    successors:      [ '%bb.2.def', '%bb.1.entry' ]
+    instructions:
+      - '%eax = MOV32rr %edi, implicit-def %rax'
+      - 'CMP32ri8 %edi, 3, implicit-def %eflags'
+      - 'JA_1 %bb.2.def, implicit %eflags'
+  - id:              1
+    name:            entry
+    successors:      [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ]
+    instructions:
+    # CHECK: [[@LINE+1]]:36: use of undefined jump table '%jump-table.2'
+      - '%rcx = LEA64r %rip, 1, _, %jump-table.2, _'
+      - '%rax = MOVSX64rm32 %rcx, 4, %rax, 0, _'
+      - '%rax = ADD64rr %rax, %rcx, implicit-def %eflags'
+      - 'JMP64r %rax'
+  - id:              2
+    name:            def
+    instructions:
+      - '%eax = MOV32r0 implicit-def %eflags'
+      - 'RETQ %eax'
+  - id:              3
+    name:            lbl1
+    instructions:
+      - '%eax = MOV32ri 1'
+      - 'RETQ %eax'
+  - id:              4
+    name:            lbl2
+    instructions:
+      - '%eax = MOV32ri 2'
+      - 'RETQ %eax'
+  - id:              5
+    name:            lbl3
+    instructions:
+      - '%eax = MOV32ri 4'
+      - 'RETQ %eax'
+  - id:              6
+    name:            lbl4
+    instructions:
+      - '%eax = MOV32ri 8'
+      - 'RETQ %eax'
+...





More information about the llvm-commits mailing list