[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