diff mbox series

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

Message ID 0E5E8D1E-E06B-4ADB-A786-98BAE4DD8BC8@ORACLE.COM
State New
Headers show
Series [i386,PR97715] : Fix a bug when adding -fzero-call-used-regs=all with -mno-80387 | expand

Commit Message

Qing Zhao Nov. 4, 2020, 8:15 p.m. UTC
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

Comments

Uros Bizjak Nov. 4, 2020, 8:17 p.m. UTC | #1
On Wed, Nov 4, 2020 at 9:16 PM Qing Zhao <QING.ZHAO@oracle.com> wrote:
>
> 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.

OK.

Thanks,
Uros.

> ---
>  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
>
diff mbox series

Patch

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" } } */
+