[llvm] [X86] Don't clobber x87 return values when zeroing call-used registers (PR #211129)
Phoebe Wang via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 18:54:08 PDT 2026
================
@@ -619,12 +619,23 @@ void X86FrameLowering::emitZeroCallUsedRegs(BitVector RegsToZero,
// Zero out FP stack if referenced. Do this outside of the loop below so that
// it's done only once.
- const X86Subtarget &ST = MF.getSubtarget<X86Subtarget>();
for (MCRegister Reg : RegsToZero.set_bits()) {
if (!X86::RFP80RegClass.contains(Reg))
continue;
- unsigned NumFPRegs = ST.is64Bit() ? 8 : 7;
+ // Don't push zeros over return values live in ST registers (implicit
+ // uses on the return): overflowing the 8-slot x87 stack replaces them
+ // with an indefinite NaN.
+ unsigned NumLiveSTRegs = 0;
+ for (const MachineInstr &MI : MBB.terminators())
+ if (MI.isReturn())
+ for (const MachineOperand &MO : MI.operands())
+ if (MO.isReg() && MO.readsReg() &&
+ X86::RSTRegClass.contains(MO.getReg()))
+ ++NumLiveSTRegs;
----------------
phoebewang wrote:
I think we can use
```
unsigned NumFPRegs = 8;
if (MBBI->hasRegisterImplicitUseOperand(X86::FP0))
NumFPRegs--;
if (MBBI->hasRegisterImplicitUseOperand(X86::FP1))
NumFPRegs--;
```
https://github.com/llvm/llvm-project/pull/211129
More information about the llvm-commits
mailing list