diff --git a/llvm/include/llvm/CodeGen/MIRYamlMapping.h b/llvm/include/llvm/CodeGen/MIRYamlMapping.h index 777819f3eae3..43c4a5dd6e37 100644 --- a/llvm/include/llvm/CodeGen/MIRYamlMapping.h +++ b/llvm/include/llvm/CodeGen/MIRYamlMapping.h @@ -300,7 +300,7 @@ template <> struct MappingTraits { struct MachineJumpTable { struct Entry { - unsigned ID; + UnsignedValue ID; std::vector Blocks; }; diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp index cc277eea9f4b..0679ec02c988 100644 --- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp @@ -582,8 +582,11 @@ bool MIRParserImpl::initializeJumpTableInfo( Blocks.push_back(MBB); } 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)); + if (!PFS.JumpTableSlots.insert(std::make_pair(Entry.ID.Value, Index)) + .second) + return error(Entry.ID.SourceRange.Start, + Twine("redefinition of jump table entry '%jump-table.") + + Twine(Entry.ID.Value) + "'"); } return false; } diff --git a/llvm/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir b/llvm/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir new file mode 100644 index 000000000000..c9d195adbd93 --- /dev/null +++ b/llvm/test/CodeGen/MIR/X86/jump-table-redefinition-error.mir @@ -0,0 +1,82 @@ +# 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' ] +# CHECK: [[@LINE+1]]:18: redefinition of jump table entry '%jump-table.0' + - 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: + - '%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' +...