[llvm] d3a8363 - [X86] Do not elect to tail call if caller must preserve all registers
Antonio Frighetto via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 16 00:55:12 PDT 2024
Author: Antonio Frighetto
Date: 2024-10-16T09:54:08+02:00
New Revision: d3a8363beccf4a45f222c63b20ba94e8d450c8db
URL: https://github.com/llvm/llvm-project/commit/d3a8363beccf4a45f222c63b20ba94e8d450c8db
DIFF: https://github.com/llvm/llvm-project/commit/d3a8363beccf4a45f222c63b20ba94e8d450c8db.diff
LOG: [X86] Do not elect to tail call if caller must preserve all registers
A miscompilation issue has been addressed with improved checking.
Fixes: https://github.com/llvm/llvm-project/issues/97758.
Added:
Modified:
llvm/lib/Target/X86/X86ISelLoweringCall.cpp
llvm/test/CodeGen/X86/tailcall-caller-nocsr.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
index 8561658379f7e4..12cd92e2d0d773 100644
--- a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
+++ b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
@@ -2856,6 +2856,13 @@ bool X86TargetLowering::IsEligibleForTailCallOptimization(
return false;
}
+ // The stack frame of the caller cannot be replaced by the tail-callee one's
+ // if the function is required to preserve all the registers. Conservatively
+ // prevent tail optimization even if hypothetically all the registers are used
+ // for passing formal parameters or returning values.
+ if (CallerF.hasFnAttribute("no_caller_saved_registers"))
+ return false;
+
unsigned StackArgsSize = CCInfo.getStackSize();
// If the callee takes no arguments then go on to check the results of the
diff --git a/llvm/test/CodeGen/X86/tailcall-caller-nocsr.ll b/llvm/test/CodeGen/X86/tailcall-caller-nocsr.ll
index 5606fbb27032fb..0385017a1ced73 100644
--- a/llvm/test/CodeGen/X86/tailcall-caller-nocsr.ll
+++ b/llvm/test/CodeGen/X86/tailcall-caller-nocsr.ll
@@ -13,8 +13,10 @@ define void @caller(i32 %0, i32 %1) #0 {
; CHECK-NEXT: pushq %rdx
; CHECK-NEXT: pushq %rcx
; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: movl %edi, %esi
; CHECK-NEXT: movl $.L.str, %edi
+; CHECK-NEXT: callq printf at PLT
; CHECK-NEXT: popq %rax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: popq %rdx
@@ -22,7 +24,7 @@ define void @caller(i32 %0, i32 %1) #0 {
; CHECK-NEXT: popq %r9
; CHECK-NEXT: popq %r10
; CHECK-NEXT: popq %r11
-; CHECK-NEXT: jmp printf at PLT # TAILCALL
+; CHECK-NEXT: retq
%3 = tail call i32 @printf(ptr @.str, i32 %0, i32 %1)
ret void
}
More information about the llvm-commits
mailing list