diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -125,6 +125,13 @@ if (NumBytes == 0) NumBytes = 4; break; + case TargetOpcode::PATCHABLE_FUNCTION_ENTER: + case TargetOpcode::PATCHABLE_FUNCTION_EXIT: + case TargetOpcode::PATCHABLE_TAIL_CALL: + // These pseudo-instructions resolve to 32 bytes of padding at runtime; + // 4 bytes for a branch over 28 bytes of NOPs. + NumBytes = 32; + break; case AArch64::SPACE: NumBytes = MI.getOperand(1).getImm(); break; diff --git a/llvm/test/CodeGen/AArch64/xray-jump-table-compression.ll b/llvm/test/CodeGen/AArch64/xray-jump-table-compression.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/xray-jump-table-compression.ll @@ -0,0 +1,127 @@ +; RUN: llc -O3 -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s + +; jump table compression to incorrectly downsizes label offsets here if xray instructions aren't taken into account +define dso_local noundef i32 @foo(i32 noundef %0) "function-instrument"="xray-always" { +; CHECK-LABEL: foo: + %2 = alloca i32, align 4 + switch i32 %0, label %3 [ + i32 1, label %3 + i32 2, label %4 + i32 3, label %5 + i32 4, label %6 + i32 5, label %7 + i32 6, label %8 + i32 7, label %9 + i32 8, label %10 + i32 9, label %11 + i32 10, label %12 + i32 11, label %13 + i32 12, label %14 + i32 13, label %15 + i32 14, label %16 + i32 15, label %17 + i32 16, label %18 + i32 17, label %19 + i32 18, label %20 + i32 19, label %21 + i32 20, label %22 + i32 21, label %23 + i32 22, label %24 + i32 23, label %25 + ] + +3: ; preds = %1 +; CHECK-LABEL: LBB0_2: + store volatile i32 1, ptr %2, align 4 + ret i32 333 + +4: ; preds = %1 + store volatile i32 2, ptr %2, align 4 + ret i32 333 + +5: ; preds = %1 + store volatile i32 3, ptr %2, align 4 + ret i32 333 + +6: ; preds = %1 + store volatile i32 4, ptr %2, align 4 + ret i32 333 + +7: ; preds = %1 + store volatile i32 5, ptr %2, align 4 + ret i32 333 + +8: ; preds = %1 + store volatile i32 6, ptr %2, align 4 + ret i32 333 + +9: ; preds = %1 + store volatile i32 7, ptr %2, align 4 + ret i32 333 + +10: ; preds = %1 + store volatile i32 8, ptr %2, align 4 + ret i32 333 + +11: ; preds = %1 + store volatile i32 9, ptr %2, align 4 + ret i32 333 + +12: ; preds = %1 + store volatile i32 10, ptr %2, align 4 + ret i32 333 + +13: ; preds = %1 + store volatile i32 11, ptr %2, align 4 + ret i32 333 + +14: ; preds = %1 + store volatile i32 12, ptr %2, align 4 + ret i32 333 + +15: ; preds = %1 + store volatile i32 13, ptr %2, align 4 + ret i32 333 + +16: ; preds = %1 + store volatile i32 14, ptr %2, align 4 + ret i32 333 + +17: ; preds = %1 + store volatile i32 15, ptr %2, align 4 + ret i32 333 + +18: ; preds = %1 + store volatile i32 16, ptr %2, align 4 + ret i32 333 + +19: ; preds = %1 + store volatile i32 17, ptr %2, align 4 + ret i32 333 + +20: ; preds = %1 + store volatile i32 18, ptr %2, align 4 + ret i32 333 + +21: ; preds = %1 + store volatile i32 19, ptr %2, align 4 + ret i32 333 + +22: ; preds = %1 + store volatile i32 20, ptr %2, align 4 + ret i32 333 + +23: ; preds = %1 + store volatile i32 21, ptr %2, align 4 + ret i32 333 + +24: ; preds = %1 + store volatile i32 22, ptr %2, align 4 + ret i32 333 + +25: ; preds = %1 + store volatile i32 23, ptr %2, align 4 + ret i32 333 +} + +; CHECK-NOT: .byte (.LBB0_2-.LBB0_2)>>2