[llvm] Revert "[BOLT][BTI] Skip inlining BasicBlocks containing indirect tailcalls" (PR #169881)

Gergely Bálint via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 28 00:24:54 PST 2025


https://github.com/bgergely0 created https://github.com/llvm/llvm-project/pull/169881

Reverts llvm/llvm-project#168403

The attached lit test is failing in some build configurations.

>From 1b5940ead64b0eb043ed4d8260fb759a77bbb8c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gergely=20B=C3=A1lint?= <balintgergely99 at gmail.com>
Date: Fri, 28 Nov 2025 09:23:01 +0100
Subject: [PATCH] =?UTF-8?q?Revert=20"[BOLT][BTI]=20Skip=20inlining=20Basic?=
 =?UTF-8?q?Blocks=20containing=20indirect=20tailcalls=20(=E2=80=A6"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit 5d6d74359d69d3aada6a46c7cf51d84eb0848b70.
---
 bolt/lib/Passes/Inliner.cpp    | 26 -----------------------
 bolt/test/AArch64/inline-bti.s | 39 ----------------------------------
 2 files changed, 65 deletions(-)
 delete mode 100644 bolt/test/AArch64/inline-bti.s

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, at function
-_Z3fooP1A:
-	ldr	x8, [x0]
-	ldr	w0, [x8]
-	br x30
-	.size	_Z3fooP1A, .-_Z3fooP1A
-
-	.globl	_Z3barP1A
-	.type	_Z3barP1A, at 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, at function
-main:
-	mov	w0, wzr
-	ret
-	.size	main, .-main



More information about the llvm-commits mailing list