[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:55:12 PDT 2024
https://github.com/FreddyLeaf updated https://github.com/llvm/llvm-project/pull/109246
>From 264ed467a253917735b4c25fc18647129b3ed4d9 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 1/2] [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 | 37 +++++++++++++++++++
2 files changed, 44 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..9a59a9eb898ab4
--- /dev/null
+++ b/llvm/test/CodeGen/X86/ipra-local-linkage-2.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -enable-ipra < %s | FileCheck %s
+
+target triple = "x86_64--"
+
+define internal void @foo() norecurse {
+; CHECK-LABEL: foo:
+; CHECK: # %bb.0:
+; CHECK-NEXT: #APP
+; CHECK-NEXT: xorl %ebp, %ebp
+; CHECK-NEXT: #NO_APP
+; CHECK-NEXT: retq
+ call void asm sideeffect "xor %ebp, %ebp", "~{ebp}"()
+ ret void
+}
+
+define void @bar(i32 %X) "frame-pointer"="all" nounwind {
+ ; When $rbp is clobbered by foo() and IPRA is enabled, $rbp should be spill/reload before/after call foo
+; CHECK-LABEL: bar:
+; CHECK: # %bb.0:
+; CHECK-NEXT: pushq %rbp
+; CHECK-NEXT: movq %rsp, %rbp
+; CHECK-NEXT: subq $16, %rsp
+; CHECK-NEXT: pushq %rbp
+; CHECK-NEXT: pushq %rax
+; CHECK-NEXT: callq foo
+; CHECK-NEXT: addq $8, %rsp
+; CHECK-NEXT: popq %rbp
+; CHECK-NEXT: movl $5, -4(%rbp)
+; CHECK-NEXT: addq $16, %rsp
+; CHECK-NEXT: popq %rbp
+; CHECK-NEXT: retq
+ call void @foo()
+ %addr = alloca i32, align 4
+ store i32 5, ptr %addr, align 4
+ ret void
+}
>From 1143462a9861c755d8db674a665c51fc35f0db4e Mon Sep 17 00:00:00 2001
From: Freddy Ye <freddy.ye at intel.com>
Date: Thu, 19 Sep 2024 14:54:57 +0800
Subject: [PATCH 2/2] address comments
---
llvm/lib/Target/X86/X86FrameLowering.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index dfdf0554ef1f27..8a24bf2dcac144 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -4571,7 +4571,7 @@ 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.
// When IPRA is enabled, we could skip this step.
- if (KillMI->isCall() && DefMI != ME && !MF.hasInlineAsm() &&
+ if (KillMI->isCall() && DefMI != ME &&
!MF.getTarget().Options.EnableIPRA) {
auto FrameSetup = std::next(DefMI);
// Look for frame setup instruction toward the start of the BB.
More information about the llvm-commits
mailing list