[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