Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/bolt
diff options
context:
space:
mode:
authorVladislav Khmelevsky <och95@yandex.ru>2022-04-01 21:57:51 +0300
committerVladislav Khmelevsky <och95@yandex.ru>2022-04-05 23:39:34 +0300
commit2e51a322195694a8eac51bff4a687d06b0f50b42 (patch)
treebd2ff177260ef1eee03fb4bec66bb276884b02c6 /bolt
parent04b42c99f62216263662d1033fa9b3e12c65563e (diff)
[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
Diffstat (limited to 'bolt')
-rw-r--r--bolt/include/bolt/Core/MCPlusBuilder.h2
-rw-r--r--bolt/lib/Target/X86/X86MCPlusBuilder.cpp4
-rw-r--r--bolt/test/AArch64/ext-double-jump.s31
3 files changed, 32 insertions, 5 deletions
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