[llvm] [X86] Refine speed up checking clobbered FP/BP to make IPRA work. (PR #109246)
Freddy Ye via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 18 23:45:39 PDT 2024
https://github.com/FreddyLeaf created https://github.com/llvm/llvm-project/pull/109246
0d471b3f64d31 resolved IPRA issue on X86 before, refined a little to make it still work after speed up checking.
>From b2c3325e218615eaa54358ecfa47fb6f4217e8e7 Mon Sep 17 00:00:00 2001
From: Freddy Ye <freddy.ye at intel.com>
Date: Tue, 3 Sep 2024 17:07:19 +0800
Subject: [PATCH] [X86] Refine Speed up checking clobbered FP/BP to make IPRA
work.
---
llvm/lib/Target/X86/X86FrameLowering.cpp | 9 ++++++--
llvm/test/CodeGen/X86/ipra-local-linkage-2.ll | 21 +++++++++++++++++++
2 files changed, 28 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/X86/ipra-local-linkage-2.ll
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 4f83267c999e4a..dfdf0554ef1f27 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -4495,7 +4495,10 @@ void X86FrameLowering::spillFPBP(MachineFunction &MF) const {
// Currently only inline asm and function call can clobbers fp/bp. So we can
// do some quick test and return early.
- if (!MF.hasInlineAsm()) {
+ // And when IPRA is on, callee may also clobber fp/bp.
+ // FIXME: setF/BPClobberedByCall(true) in RegUsageInfoPropagation::setRegMask
+ // so we don't need the condition of IPRA here.
+ if (!MF.hasInlineAsm() && !MF.getTarget().Options.EnableIPRA) {
X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
if (!X86FI->getFPClobberedByCall())
FP = 0;
@@ -4567,7 +4570,9 @@ void X86FrameLowering::spillFPBP(MachineFunction &MF) const {
// If the bp is clobbered by a call, we should save and restore outside of
// the frame setup instructions.
- if (KillMI->isCall() && DefMI != ME) {
+ // When IPRA is enabled, we could skip this step.
+ if (KillMI->isCall() && DefMI != ME && !MF.hasInlineAsm() &&
+ !MF.getTarget().Options.EnableIPRA) {
auto FrameSetup = std::next(DefMI);
// Look for frame setup instruction toward the start of the BB.
// If we reach another call instruction, it means no frame setup
diff --git a/llvm/test/CodeGen/X86/ipra-local-linkage-2.ll b/llvm/test/CodeGen/X86/ipra-local-linkage-2.ll
new file mode 100644
index 00000000000000..aad2b5c6c85417
--- /dev/null
+++ b/llvm/test/CodeGen/X86/ipra-local-linkage-2.ll
@@ -0,0 +1,21 @@
+; RUN: llc -enable-ipra < %s | FileCheck %s
+
+target triple = "x86_64--"
+
+define internal void @foo() norecurse {
+ call void asm sideeffect "xor %ebp, %ebp", "~{ebp}"()
+ ret void
+}
+
+define void @bar(i32 %X) "frame-pointer"="all" {
+ ; When $rbp is clobbered by foo() and IPRA is enabled, $rbp should be spill/reload before/after call foo
+ ; CHECK-LABEL: bar:
+ ; CHECK: pushq %rbp
+ ; CHECK: callq foo
+ ; CHECK: popq %rbp
+ ; CHECK: movl $5, -4(%rbp)
+ call void @foo()
+ %addr = alloca i32, align 4
+ store i32 5, ptr %addr, align 4
+ ret void
+}
More information about the llvm-commits
mailing list