-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[X86] Speed up checking clobbered FP/BP #102365
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
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/pr-subscribers-backend-x86 Author: None (weiguozhi) ChangesMost 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. Full diff: https://github.com/llvm/llvm-project/pull/102365.diff 3 Files Affected:
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 77dac1197f85e9..8404f2231680d6 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 f659c168b86e0e..1e609a84673a3c 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 315aeef65d28c8..13d57c2fa9dfbc 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
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks for the quick fix!
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.