[Patch][i386][PR97715]: Fix a bug when adding -fzero-call-used-regs=all with -mno-80387

Qing Zhao QING.ZHAO@ORACLE.COM
Wed Nov 4 20:15:54 GMT 2020


As we discussed in the bug report, we should not zero stack registers when there is no x87 registers available. 

The following is the fix per Jakub’s suggestion. 

And I have tested it on X86.

Okay for commit?

thanks.

Qing

From 0080f104df2dc752969a1949981ba343f276e802 Mon Sep 17 00:00:00 2001
From: qing zhao <qinzhao@gcc.gnu.org>
Date: Wed, 4 Nov 2020 20:46:15 +0100
Subject: [PATCH] i386: Fix PR97715

This change fixes a bug in the i386 backend when adding
-fzero-call-used-regs=all on a target that has no x87
registers.

When there is no x87 registers available, we should not
zero stack registers.

gcc/Changelog:

	PR target/97715
	* config/i386/i386.c (zero_all_st_registers): Return
	earlier when the FPU is disabled.

gcc/testsuite/ChnageLog:

	PR target/97715
	* gcc.target/i386/zero-scratch-regs-32.c: New test.
---
 gcc/config/i386/i386.c                               |  5 +++++
 gcc/testsuite/gcc.target/i386/zero-scratch-regs-32.c | 11 +++++++++++
 2 files changed, 16 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/i386/zero-scratch-regs-32.c

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 6fc6228a26e..789ef727cf8 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3640,6 +3640,11 @@ zero_all_vector_registers (HARD_REG_SET need_zeroed_hardregs)
 static bool
 zero_all_st_registers (HARD_REG_SET need_zeroed_hardregs)
 {
+
+  /* If the FPU is disabled, no need to zero all st registers.  */
+  if (! (TARGET_80387 || TARGET_FLOAT_RETURNS_IN_80387))
+    return false;
+
   unsigned int num_of_st = 0;
   for (unsigned int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
     if ((STACK_REGNO_P (regno) || MMX_REGNO_P (regno))
diff --git a/gcc/testsuite/gcc.target/i386/zero-scratch-regs-32.c b/gcc/testsuite/gcc.target/i386/zero-scratch-regs-32.c
new file mode 100644
index 00000000000..ca3261fe5ea
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/zero-scratch-regs-32.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fzero-call-used-regs=all -mno-80387" } */
+
+int
+foo (int x)
+{
+  return (x + 1);
+}
+
+/* { dg-final { scan-assembler-not "fldz" } } */
+
-- 
2.11.0



More information about the Gcc-patches mailing list