diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp --- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp +++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp @@ -998,7 +998,15 @@ Register TableReg = MI.getOperand(2).getReg(); Register EntryReg = MI.getOperand(3).getReg(); int JTIdx = MI.getOperand(4).getIndex(); - int Size = AArch64FI->getJumpTableEntrySize(JTIdx); + + int Size; + switch (MI.getOpcode()) { + case AArch64::JumpTableDest32: Size = 4; break; + case AArch64::JumpTableDest16: Size = 2; break; + case AArch64::JumpTableDest8: Size = 1; break; + default: + llvm_unreachable("Unknown jump table size."); + } // This has to be first because the compression pass based its reachability // calculations on the start of the JumpTableDest instruction. diff --git a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h --- a/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h +++ b/llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.h @@ -361,7 +361,9 @@ return JumpTableEntryInfo[Idx].first; } MCSymbol *getJumpTableEntryPCRelSymbol(int Idx) const { - return JumpTableEntryInfo[Idx].second; + return (unsigned)Idx < JumpTableEntryInfo.size() + ? JumpTableEntryInfo[Idx].second + : nullptr; } void setJumpTableEntryInfo(int Idx, unsigned Size, MCSymbol *PCRelSym) { if ((unsigned)Idx >= JumpTableEntryInfo.size()) diff --git a/llvm/test/CodeGen/AArch64/arm64-jumptable.ll b/llvm/test/CodeGen/AArch64/arm64-jumptable.ll --- a/llvm/test/CodeGen/AArch64/arm64-jumptable.ll +++ b/llvm/test/CodeGen/AArch64/arm64-jumptable.ll @@ -2,6 +2,9 @@ ; RUN: llc -mtriple=arm64-linux-gnu < %s | FileCheck %s --check-prefix=CHECK-LINUX ; +; RUN: llc -mtriple=aarch64 -stop-after=unpack-mi-bundles -o %t.mir %s +; RUN: llc %t.mir -mtriple=aarch64 -start-after=unpack-mi-bundles -o - | FileCheck %s --check-prefix=CHECK-MIR + define void @sum(i32 %a, ptr %to, i32 %c) { entry: switch i32 %a, label %exit [ @@ -32,3 +35,9 @@ ; CHECK-LINUX-LABEL: sum: ; CHECK-LINUX: adrp {{x[0-9]+}}, .LJTI0_0 ; CHECK-LINUX: add {{x[0-9]+}}, {{x[0-9]+}}, :lo12:.LJTI0_0 + +; CHECK-MIR: sum: +; CHECK-MIR: adrp {{x[0-9]+}}, .LJTI0_0 +; CHECK-MIR: add {{x[0-9]+}}, {{x[0-9]+}}, :lo12:.LJTI0_0 +; CHECK-MIR: .Ltmp0: +; CHECK-MIR: adr {{x[0-9]+}}, .Ltmp0