[llvm] [X86] Speed up checking clobbered FP/BP (PR #102365)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 7 13:36:52 PDT 2024
https://github.com/weiguozhi created https://github.com/llvm/llvm-project/pull/102365
Most functions don't clobber frame register and base pointer. They are usually caused by inline asm and function call. So we can record if a function call clobber FP/BP at lowering phase, and later we can check the recorded information and return early.
>From 17088b42f0fd4891ae7632462f94d2e02aa68e69 Mon Sep 17 00:00:00 2001
From: Guozhi Wei <carrot at google.com>
Date: Wed, 7 Aug 2024 13:24:13 -0700
Subject: [PATCH] [X86] Speed up checking clobbered FP/BP
Most functions don't clobber frame register and base pointer. They are
usually caused by inline asm and function call. So we can record if a
function call clobber FP/BP at lowering phase, and later we can check
the recorded information and return early.
---
llvm/lib/Target/X86/X86FrameLowering.cpp | 10 ++++++++++
llvm/lib/Target/X86/X86ISelLoweringCall.cpp | 5 +++++
llvm/lib/Target/X86/X86MachineFunctionInfo.h | 10 ++++++++++
3 files changed, 25 insertions(+)
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 77dac1197f85e..8404f2231680d 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -4458,6 +4458,16 @@ void X86FrameLowering::spillFPBP(MachineFunction &MF) const {
FP = TRI->getFrameRegister(MF);
if (TRI->hasBasePointer(MF))
BP = TRI->getBaseRegister();
+
+ // Currently only inline asm and function call can clobbers fp/bp. So we can
+ // do some quick test and return early.
+ if (!MF.hasInlineAsm()) {
+ X86MachineFunctionInfo *X86FI = MF.getInfo<X86MachineFunctionInfo>();
+ if (!X86FI->getFPClobberedByCall())
+ FP = 0;
+ if (!X86FI->getBPClobberedByCall())
+ BP = 0;
+ }
if (!FP && !BP)
return;
diff --git a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
index f659c168b86e0..1e609a84673a3 100644
--- a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
+++ b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
@@ -2450,6 +2450,11 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
}();
assert(Mask && "Missing call preserved mask for calling convention");
+ if (MachineOperand::clobbersPhysReg(Mask, RegInfo->getFrameRegister(MF)))
+ X86Info->setFPClobberedByCall(true);
+ if (MachineOperand::clobbersPhysReg(Mask, RegInfo->getBaseRegister()))
+ X86Info->setBPClobberedByCall(true);
+
// If this is an invoke in a 32-bit function using a funclet-based
// personality, assume the function clobbers all registers. If an exception
// is thrown, the runtime will not restore CSRs.
diff --git a/llvm/lib/Target/X86/X86MachineFunctionInfo.h b/llvm/lib/Target/X86/X86MachineFunctionInfo.h
index 315aeef65d28c..13d57c2fa9dfb 100644
--- a/llvm/lib/Target/X86/X86MachineFunctionInfo.h
+++ b/llvm/lib/Target/X86/X86MachineFunctionInfo.h
@@ -170,6 +170,10 @@ class X86MachineFunctionInfo : public MachineFunctionInfo {
SmallVector<size_t, 0> PreallocatedStackSizes;
SmallVector<SmallVector<size_t, 4>, 0> PreallocatedArgOffsets;
+ // True if a function clobbers FP/BP according to its calling convention.
+ bool FPClobberedByCall = false;
+ bool BPClobberedByCall = false;
+
private:
/// ForwardedMustTailRegParms - A list of virtual and physical registers
/// that must be forwarded to every musttail call.
@@ -328,6 +332,12 @@ class X86MachineFunctionInfo : public MachineFunctionInfo {
assert(!PreallocatedArgOffsets[Id].empty() && "arg offsets not set");
return PreallocatedArgOffsets[Id];
}
+
+ bool getFPClobberedByCall() const { return FPClobberedByCall; }
+ void setFPClobberedByCall(bool C) { FPClobberedByCall = C; }
+
+ bool getBPClobberedByCall() const { return BPClobberedByCall; }
+ void setBPClobberedByCall(bool C) { BPClobberedByCall = C; }
};
} // End llvm namespace
More information about the llvm-commits
mailing list