From 2e51a322195694a8eac51bff4a687d06b0f50b42 Mon Sep 17 00:00:00 2001 From: Vladislav Khmelevsky Date: Fri, 1 Apr 2022 21:57:51 +0300 Subject: [BOLT] Check for !isTailCall in isUnconditionalBranch Add !isTailCall in isUnconditionalBranch check in order to sync the x86 and aarch64 and fix the fixDoubleJumps pass on aarch64. Vladislav Khmelevsky, Advanced Software Technology Lab, Huawei Differential Revision: https://reviews.llvm.org/D122929 --- bolt/include/bolt/Core/MCPlusBuilder.h | 2 +- bolt/lib/Target/X86/X86MCPlusBuilder.cpp | 4 ---- bolt/test/AArch64/ext-double-jump.s | 31 +++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 bolt/test/AArch64/ext-double-jump.s (limited to 'bolt') diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h index fae655e119d1..02588c29462a 100644 --- a/bolt/include/bolt/Core/MCPlusBuilder.h +++ b/bolt/include/bolt/Core/MCPlusBuilder.h @@ -353,7 +353,7 @@ public: } virtual bool isUnconditionalBranch(const MCInst &Inst) const { - return Analysis->isUnconditionalBranch(Inst); + return Analysis->isUnconditionalBranch(Inst) && !isTailCall(Inst); } virtual bool isIndirectBranch(const MCInst &Inst) const { diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp index ef6ae1e500ee..b7678cbff06b 100644 --- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp +++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp @@ -78,10 +78,6 @@ public: return Analysis->isBranch(Inst) && !isTailCall(Inst); } - bool isUnconditionalBranch(const MCInst &Inst) const override { - return Analysis->isUnconditionalBranch(Inst) && !isTailCall(Inst); - } - bool isNoop(const MCInst &Inst) const override { return X86::isNOP(Inst.getOpcode()); } diff --git a/bolt/test/AArch64/ext-double-jump.s b/bolt/test/AArch64/ext-double-jump.s new file mode 100644 index 000000000000..a039cd424c9e --- /dev/null +++ b/bolt/test/AArch64/ext-double-jump.s @@ -0,0 +1,31 @@ +# This test checks that remove double jumps pass works properly with +# non-local branches. + +# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o +# RUN: %clang %cflags -nostartfiles -nodefaultlibs %t.o -o %t.exe -Wl,-q +# RUN: llvm-bolt %t.exe -o %t.bolt -peepholes=double-jumps + + .text + .align 4 + .global dummy1 + .type dummy1, %function +dummy1: + mov x2, x0 + ret + .size dummy1, .-dummy1 + + .global dummy2 + .type dummy2, %function +dummy2: + mov x1, x0 + ret + .size dummy2, .-dummy2 + + .global _start + .type _start, %function +_start: + cbz x10, 1f + b dummy1 +1: + b dummy2 + .size _start, .-_start -- cgit v1.2.3