From 4be56e93706f94de488c4ca31e98510bbdd0bc47 Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Wed, 12 Aug 2015 21:11:08 +0000 Subject: [PATCH] MIR Serialization: Serialize the jump table pseudo source values. llvm-svn: 244813 --- llvm/lib/CodeGen/MIRParser/MILexer.cpp | 1 + llvm/lib/CodeGen/MIRParser/MILexer.h | 1 + llvm/lib/CodeGen/MIRParser/MIParser.cpp | 5 +- llvm/lib/CodeGen/MIRPrinter.cpp | 3 ++ llvm/test/CodeGen/MIR/X86/memory-operands.mir | 76 +++++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 1 deletion(-) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index 950181b..25afedf 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -203,6 +203,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("align", MIToken::kw_align) .Case("stack", MIToken::kw_stack) .Case("got", MIToken::kw_got) + .Case("jump-table", MIToken::kw_jump_table) .Case("constant-pool", MIToken::kw_constant_pool) .Case("liveout", MIToken::kw_liveout) .Default(MIToken::Identifier); diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index beb38d0..d0ae379 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -72,6 +72,7 @@ struct MIToken { kw_align, kw_stack, kw_got, + kw_jump_table, kw_constant_pool, kw_liveout, diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index 6dae29a..ec70ea3 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -1127,6 +1127,9 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { case MIToken::kw_got: PSV = MF.getPSVManager().getGOT(); break; + case MIToken::kw_jump_table: + PSV = MF.getPSVManager().getJumpTable(); + break; case MIToken::kw_constant_pool: PSV = MF.getPSVManager().getConstantPool(); break; @@ -1140,7 +1143,7 @@ bool MIParser::parseMemoryPseudoSourceValue(const PseudoSourceValue *&PSV) { bool MIParser::parseMachinePointerInfo(MachinePointerInfo &Dest) { if (Token.is(MIToken::kw_constant_pool) || Token.is(MIToken::kw_stack) || - Token.is(MIToken::kw_got)) { + Token.is(MIToken::kw_got) || Token.is(MIToken::kw_jump_table)) { const PseudoSourceValue *PSV = nullptr; if (parseMemoryPseudoSourceValue(PSV)) return true; diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp index 83e7b3e..367626a 100644 --- a/llvm/lib/CodeGen/MIRPrinter.cpp +++ b/llvm/lib/CodeGen/MIRPrinter.cpp @@ -716,6 +716,9 @@ void MIPrinter::print(const MachineMemOperand &Op) { case PseudoSourceValue::GOT: OS << "got"; break; + case PseudoSourceValue::JumpTable: + OS << "jump-table"; + break; case PseudoSourceValue::ConstantPool: OS << "constant-pool"; break; diff --git a/llvm/test/CodeGen/MIR/X86/memory-operands.mir b/llvm/test/CodeGen/MIR/X86/memory-operands.mir index c95d6d4..002d147 100644 --- a/llvm/test/CodeGen/MIR/X86/memory-operands.mir +++ b/llvm/test/CodeGen/MIR/X86/memory-operands.mir @@ -84,6 +84,26 @@ ret i32 %b } + define i32 @jumptable_psv(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 @@ -269,3 +289,59 @@ body: - '%eax = INC32r killed %eax, implicit-def dead %eflags' - 'RETQ %eax' ... +--- +name: jumptable_psv +tracksRegLiveness: true +liveins: + - { reg: '%edi' } +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' ] + liveins: [ '%edi' ] + instructions: + - '%eax = MOV32rr %edi, implicit-def %rax' + - 'CMP32ri8 killed %edi, 3, implicit-def %eflags' + - 'JA_1 %bb.2.def, implicit killed %eflags' + - id: 1 + name: entry + successors: [ '%bb.3.lbl1', '%bb.4.lbl2', '%bb.5.lbl3', '%bb.6.lbl4' ] + liveins: [ '%rax' ] + instructions: + - '%rcx = LEA64r %rip, 1, _, %jump-table.0, _' +# CHECK: name: jumptable_psv +# CHECK: %rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8) + - '%rax = MOVSX64rm32 %rcx, 4, killed %rax, 0, _ :: (load 4 from jump-table, align 8)' + - '%rax = ADD64rr killed %rax, killed %rcx, implicit-def dead %eflags' + - 'JMP64r killed %rax' + - id: 2 + name: def + instructions: + - '%eax = MOV32r0 implicit-def dead %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' +... -- 2.7.4