Skip to content

Conversation

@bgergely0
Copy link
Contributor

Reverts #168403

The attached lit test is failing in some build configurations.

@llvmbot
Copy link
Member

llvmbot commented Nov 28, 2025

@llvm/pr-subscribers-bolt

Author: Gergely Bálint (bgergely0)

Changes

Reverts llvm/llvm-project#168403

The attached lit test is failing in some build configurations.


Full diff: https://github.com/llvm/llvm-project/pull/169881.diff

2 Files Affected:

  • (modified) bolt/lib/Passes/Inliner.cpp (-26)
  • (removed) bolt/test/AArch64/inline-bti.s (-39)
diff --git a/bolt/lib/Passes/Inliner.cpp b/bolt/lib/Passes/Inliner.cpp
index 0740fcef9102b..5a7d02a34b4d8 100644
--- a/bolt/lib/Passes/Inliner.cpp
+++ b/bolt/lib/Passes/Inliner.cpp
@@ -491,32 +491,6 @@ bool Inliner::inlineCallsInFunction(BinaryFunction &Function) {
         }
       }
 
-      // AArch64 BTI:
-      // If the callee has an indirect tailcall (BR), we would transform it to
-      // an indirect call (BLR) in InlineCall. Because of this, we would have to
-      // update the BTI at the target of the tailcall. However, these targets
-      // are not known. Instead, we skip inlining blocks with indirect
-      // tailcalls.
-      auto HasIndirectTailCall = [&](const BinaryFunction &BF) -> bool {
-        for (const auto &BB : BF) {
-          for (const auto &II : BB) {
-            if (BC.MIB->isIndirectBranch(II) && BC.MIB->isTailCall(II)) {
-              return true;
-            }
-          }
-        }
-        return false;
-      };
-
-      if (BC.isAArch64() && BC.usesBTI() &&
-          HasIndirectTailCall(*TargetFunction)) {
-        ++InstIt;
-        LLVM_DEBUG(dbgs() << "BOLT-DEBUG: Skipping inlining block with tailcall"
-                          << " in " << Function << " : " << BB->getName()
-                          << " to keep BTIs consistent.\n");
-        continue;
-      }
-
       LLVM_DEBUG(dbgs() << "BOLT-DEBUG: inlining call to " << *TargetFunction
                         << " in " << Function << " : " << BB->getName()
                         << ". Count: " << BB->getKnownExecutionCount()
diff --git a/bolt/test/AArch64/inline-bti.s b/bolt/test/AArch64/inline-bti.s
deleted file mode 100644
index c0b9ebe632b6c..0000000000000
--- a/bolt/test/AArch64/inline-bti.s
+++ /dev/null
@@ -1,39 +0,0 @@
-## This test checks that for AArch64 binaries with BTI, we do not inline blocks with indirect tailcalls.
-
-# REQUIRES: system-linux
-
-# RUN: llvm-mc -filetype=obj -triple aarch64-unknown-unknown %s -o %t.o
-# RUN: %clang %cflags -O0 %t.o -o %t.exe -Wl,-q -Wl,-z,force-bti
-# RUN: llvm-bolt --inline-all %t.exe -o %t.bolt --debug 2>&1 | FileCheck %s
-
-# For BTI, we should not inline foo.
-# CHECK: BOLT-DEBUG: Skipping inlining block with tailcall in _Z3barP1A : .LBB01 to keep BTIs consistent.
-# CHECK-NOT: BOLT-INFO: inlined {{[0-9]+}} calls at {{[0-9]+}} call sites in {{[0-9]+}} iteration(s). Change in binary size: {{[0-9]+}} bytes.
-
-	.text
-	.globl	_Z3fooP1A
-	.type	_Z3fooP1A,@function
-_Z3fooP1A:
-	ldr	x8, [x0]
-	ldr	w0, [x8]
-	br x30
-	.size	_Z3fooP1A, .-_Z3fooP1A
-
-	.globl	_Z3barP1A
-	.type	_Z3barP1A,@function
-_Z3barP1A:
-	stp	x29, x30, [sp, #-16]!
-	mov	x29, sp
-	bl	_Z3fooP1A
-	mul	w0, w0, w0
-	ldp	x29, x30, [sp], #16
-	ret
-	.size	_Z3barP1A, .-_Z3barP1A
-
-	.globl	main
-	.p2align	2
-	.type	main,@function
-main:
-	mov	w0, wzr
-	ret
-	.size	main, .-main

@bgergely0 bgergely0 requested a review from tbaederr November 28, 2025 08:25
@bgergely0 bgergely0 merged commit 9bffb10 into main Nov 28, 2025
12 checks passed
@bgergely0 bgergely0 deleted the revert-168403-users/bgergely0/bolt-bti-inliner branch November 28, 2025 09:10
Copy link
Member

@paschalis-mpeis paschalis-mpeis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was this a quick revert? Can reland by requiring asserts?

@bgergely0
Copy link
Contributor Author

Yeah, I think the assert requirement will be it. I just didn't want to keep the failing test in while I investigate.

bgergely0 added a commit that referenced this pull request Nov 28, 2025
…ilcalls" (#169881)

This reverts commit 9bffb10.

Fix: added assertions to the requirements of the test

--------

Original commit message:

In the Inliner pass, tailcalls are converted to calls in the inlined
BasicBlock. If the tailcall is indirect, the `BR` is converted to `BLR`.

These instructions require different BTI landing pads at their targets.

As the targets of indirect tailcalls are unknown, inlining such blocks
is unsound for BTI: they should be skipped instead.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants