public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Re:: [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
@ 2014-01-15 13:20 Peter Bergner
  2014-01-16  8:11 ` : " Uros Bizjak
  0 siblings, 1 reply; 5+ messages in thread
From: Peter Bergner @ 2014-01-15 13:20 UTC (permalink / raw)
  To: gcc-patches
  Cc: Richard Biener, Jakub Jelinek, Vladimir Makarov,
	Richard Henderson, Uros Bizjak

Oops, forgot to CC the x86 maintainers.  Is the i386.c change ok for 4.8?

Peter


-------- Forwarded Message --------
From: Peter Bergner <bergner@vnet.ibm.com>
To: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>
Cc: Richard Biener <richard.guenther@gmail.com>, Jakub Jelinek <jakub@redhat.com>, Vladimir Makarov <vmakarov@redhat.com>
Subject: [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
Date: Tue, 14 Jan 2014 11:22:13 -0600

The mainline fix for PR58139 which is a wrong code gen bug was
submitted here:

    http://gcc.gnu.org/ml/gcc-patches/2013-08/msg00910.html

and approved for mainline and 4.8 (after a few weeks) here:

    http://gcc.gnu.org/ml/gcc-patches/2013-09/msg00134.html

However, my fix exposed a latent x86 bug, so this patch was never
committed to 4.8.  The latent x86 bug was fixed by Honza and I'd
like to now ask to be able to backport my fix for PR58139 along
with Honza's fix to 4.8.

This passed bootstrap and regtesting on powerpc64-linux and
I bootstrapped this on x86_64 and verified that the ICE seen
when compiling the test case with only my patch in:

    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58269#c2

is fixed when we add Honza's patch.  Ok for 4.8?

Peter


	Backport from mainline
	2013-09-06  Jan Hubicka  <jh@suse.cz>

	* config/i386/i386.c (ix86_hard_regno_mode_ok): AVX modes are valid
	only when AVX is enabled.

	2013-09-05  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/58139
	* reginfo.c (choose_hard_reg_mode): Scan through all mode classes
	looking for widest mode.

Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	(revision 206582)
+++ gcc/config/i386/i386.c	(working copy)
@@ -33944,7 +33944,7 @@ ix86_hard_regno_mode_ok (int regno, enum
 	 are available.  OImode move is available only when AVX is
 	 enabled.  */
       return ((TARGET_AVX && mode == OImode)
-	      || VALID_AVX256_REG_MODE (mode)
+	      || (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
 	      || VALID_SSE_REG_MODE (mode)
 	      || VALID_SSE2_REG_MODE (mode)
 	      || VALID_MMX_REG_MODE (mode)
Index: gcc/reginfo.c
===================================================================
--- gcc/reginfo.c	(revision 206582)
+++ gcc/reginfo.c	(working copy)
@@ -620,40 +620,35 @@ choose_hard_reg_mode (unsigned int regno
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

   if (found_mode != VOIDmode)




^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: : [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
  2014-01-15 13:20 Re:: [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8 Peter Bergner
@ 2014-01-16  8:11 ` Uros Bizjak
  2014-01-16 12:40   ` Peter Bergner
  0 siblings, 1 reply; 5+ messages in thread
From: Uros Bizjak @ 2014-01-16  8:11 UTC (permalink / raw)
  To: Peter Bergner
  Cc: gcc-patches, Richard Biener, Jakub Jelinek, Vladimir Makarov,
	Richard Henderson, Jan Hubicka

On Wed, Jan 15, 2014 at 2:19 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> Oops, forgot to CC the x86 maintainers.  Is the i386.c change ok for 4.8?
>
> Peter
>
>
> -------- Forwarded Message --------
> From: Peter Bergner <bergner@vnet.ibm.com>
> To: gcc-patches@gcc.gnu.org <gcc-patches@gcc.gnu.org>
> Cc: Richard Biener <richard.guenther@gmail.com>, Jakub Jelinek <jakub@redhat.com>, Vladimir Makarov <vmakarov@redhat.com>
> Subject: [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
> Date: Tue, 14 Jan 2014 11:22:13 -0600
>
> The mainline fix for PR58139 which is a wrong code gen bug was
> submitted here:
>
>     http://gcc.gnu.org/ml/gcc-patches/2013-08/msg00910.html
>
> and approved for mainline and 4.8 (after a few weeks) here:
>
>     http://gcc.gnu.org/ml/gcc-patches/2013-09/msg00134.html
>
> However, my fix exposed a latent x86 bug, so this patch was never
> committed to 4.8.  The latent x86 bug was fixed by Honza and I'd
> like to now ask to be able to backport my fix for PR58139 along
> with Honza's fix to 4.8.
>
> This passed bootstrap and regtesting on powerpc64-linux and
> I bootstrapped this on x86_64 and verified that the ICE seen
> when compiling the test case with only my patch in:
>
>     http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58269#c2
>
> is fixed when we add Honza's patch.  Ok for 4.8?
>
> Peter
>
>
>         Backport from mainline
>         2013-09-06  Jan Hubicka  <jh@suse.cz>
>
>         * config/i386/i386.c (ix86_hard_regno_mode_ok): AVX modes are valid
>         only when AVX is enabled.
>
>         2013-09-05  Peter Bergner  <bergner@vnet.ibm.com>
>
>         PR target/58139
>         * reginfo.c (choose_hard_reg_mode): Scan through all mode classes
>         looking for widest mode.

OK for x86, with slight update, as suggested below.

> Index: gcc/config/i386/i386.c
> ===================================================================
> --- gcc/config/i386/i386.c      (revision 206582)
> +++ gcc/config/i386/i386.c      (working copy)
> @@ -33944,7 +33944,7 @@ ix86_hard_regno_mode_ok (int regno, enum
>          are available.  OImode move is available only when AVX is
>          enabled.  */
>        return ((TARGET_AVX && mode == OImode)
> -             || VALID_AVX256_REG_MODE (mode)
> +             || (TARGET_AVX && VALID_AVX256_REG_MODE (mode))

Please use VALID_AVX256_REG_OR_IO_MODE define:

      /* OImode move and AVX modes are available only when AVX is enabled.  */
      return ((TARGET_AVX
           && VALID_AVX256_REG_OR_OI_MODE (mode))
...

Thanks,
Uros.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: : [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
  2014-01-16  8:11 ` : " Uros Bizjak
@ 2014-01-16 12:40   ` Peter Bergner
  2014-01-16 12:49     ` Uros Bizjak
  0 siblings, 1 reply; 5+ messages in thread
From: Peter Bergner @ 2014-01-16 12:40 UTC (permalink / raw)
  To: Uros Bizjak
  Cc: gcc-patches, Richard Biener, Jakub Jelinek, Vladimir Makarov,
	Richard Henderson, Jan Hubicka

On Thu, 2014-01-16 at 09:11 +0100, Uros Bizjak wrote:
> On Wed, Jan 15, 2014 at 2:19 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> >         Backport from mainline
> >         2013-09-06  Jan Hubicka  <jh@suse.cz>
> >
> >         * config/i386/i386.c (ix86_hard_regno_mode_ok): AVX modes are valid
> >         only when AVX is enabled.
> 
> OK for x86, with slight update, as suggested below.
> 
> > Index: gcc/config/i386/i386.c
> > ===================================================================
> > --- gcc/config/i386/i386.c      (revision 206582)
> > +++ gcc/config/i386/i386.c      (working copy)
> > @@ -33944,7 +33944,7 @@ ix86_hard_regno_mode_ok (int regno, enum
> >          are available.  OImode move is available only when AVX is
> >          enabled.  */
> >        return ((TARGET_AVX && mode == OImode)
> > -             || VALID_AVX256_REG_MODE (mode)
> > +             || (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
> 
> Please use VALID_AVX256_REG_OR_IO_MODE define:

We were already testing for OImode, so do you want me to
remove the redundant compare and make the code look like
the following instead?

Peter


Index: i386.c
===================================================================
--- i386.c	(revision 206582)
+++ i386.c	(working copy)
@@ -33943,8 +33943,7 @@ ix86_hard_regno_mode_ok (int regno, enum
 	 out of SSE registers, even when no operation instructions
 	 are available.  OImode move is available only when AVX is
 	 enabled.  */
-      return ((TARGET_AVX && mode == OImode)
-	      || VALID_AVX256_REG_MODE (mode)
+      return ((TARGET_AVX && VALID_AVX256_REG_OR_OI_MODE (mode))
 	      || VALID_SSE_REG_MODE (mode)
 	      || VALID_SSE2_REG_MODE (mode)
 	      || VALID_MMX_REG_MODE (mode)


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: : [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
  2014-01-16 12:40   ` Peter Bergner
@ 2014-01-16 12:49     ` Uros Bizjak
  2014-01-16 14:58       ` Peter Bergner
  0 siblings, 1 reply; 5+ messages in thread
From: Uros Bizjak @ 2014-01-16 12:49 UTC (permalink / raw)
  To: Peter Bergner
  Cc: gcc-patches, Richard Biener, Jakub Jelinek, Vladimir Makarov,
	Richard Henderson, Jan Hubicka

On Thu, Jan 16, 2014 at 1:39 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:

>> >         Backport from mainline
>> >         2013-09-06  Jan Hubicka  <jh@suse.cz>
>> >
>> >         * config/i386/i386.c (ix86_hard_regno_mode_ok): AVX modes are valid
>> >         only when AVX is enabled.
>>
>> OK for x86, with slight update, as suggested below.
>>
>> > Index: gcc/config/i386/i386.c
>> > ===================================================================
>> > --- gcc/config/i386/i386.c      (revision 206582)
>> > +++ gcc/config/i386/i386.c      (working copy)
>> > @@ -33944,7 +33944,7 @@ ix86_hard_regno_mode_ok (int regno, enum
>> >          are available.  OImode move is available only when AVX is
>> >          enabled.  */
>> >        return ((TARGET_AVX && mode == OImode)
>> > -             || VALID_AVX256_REG_MODE (mode)
>> > +             || (TARGET_AVX && VALID_AVX256_REG_MODE (mode))
>>
>> Please use VALID_AVX256_REG_OR_IO_MODE define:
>
> We were already testing for OImode, so do you want me to
> remove the redundant compare and make the code look like
> the following instead?

Yes, just use [1] from mainline.

[1] http://gcc.gnu.org/ml/gcc-patches/2014-01/msg00954.html

Thanks,
Uros.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: : [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8
  2014-01-16 12:49     ` Uros Bizjak
@ 2014-01-16 14:58       ` Peter Bergner
  0 siblings, 0 replies; 5+ messages in thread
From: Peter Bergner @ 2014-01-16 14:58 UTC (permalink / raw)
  To: Uros Bizjak
  Cc: gcc-patches, Richard Biener, Jakub Jelinek, Vladimir Makarov,
	Richard Henderson, Jan Hubicka

On Thu, 2014-01-16 at 13:49 +0100, Uros Bizjak wrote:
> On Thu, Jan 16, 2014 at 1:39 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> > We were already testing for OImode, so do you want me to
> > remove the redundant compare and make the code look like
> > the following instead?
> 
> Yes, just use [1] from mainline.
> 
> [1] http://gcc.gnu.org/ml/gcc-patches/2014-01/msg00954.html

Ok, here is what I ended up committing.  Thanks!

Peter


	Backport from mainline
	2014-01-15  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.c (ix86_hard_regno_mode_ok): Use
	VALID_AVX256_REG_OR_OI_MODE.

	2013-09-05  Peter Bergner  <bergner@vnet.ibm.com>

	PR target/58139
	* reginfo.c (choose_hard_reg_mode): Scan through all mode classes
	looking for widest mode.

Index: config/i386/i386.c
===================================================================
--- config/i386/i386.c	(revision 206661)
+++ config/i386/i386.c	(working copy)
@@ -33933,10 +33933,10 @@ ix86_hard_regno_mode_ok (int regno, enum
     {
       /* We implement the move patterns for all vector modes into and
 	 out of SSE registers, even when no operation instructions
-	 are available.  OImode move is available only when AVX is
-	 enabled.  */
-      return ((TARGET_AVX && mode == OImode)
-	      || VALID_AVX256_REG_MODE (mode)
+	 are available.  OImode and AVX modes are available only when
+	 AVX is enabled.  */
+      return ((TARGET_AVX
+	       && VALID_AVX256_REG_OR_OI_MODE (mode))
 	      || VALID_SSE_REG_MODE (mode)
 	      || VALID_SSE2_REG_MODE (mode)
 	      || VALID_MMX_REG_MODE (mode)
Index: reginfo.c
===================================================================
--- reginfo.c	(revision 206661)
+++ reginfo.c	(working copy)
@@ -620,40 +620,35 @@ choose_hard_reg_mode (unsigned int regno
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_FLOAT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

-  if (found_mode != VOIDmode)
-    return found_mode;
-
   for (mode = GET_CLASS_NARROWEST_MODE (MODE_VECTOR_INT);
        mode != VOIDmode;
        mode = GET_MODE_WIDER_MODE (mode))
     if ((unsigned) hard_regno_nregs[regno][mode] == nregs
 	&& HARD_REGNO_MODE_OK (regno, mode)
-	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)))
+	&& (! call_saved || ! HARD_REGNO_CALL_PART_CLOBBERED (regno, mode))
+	&& GET_MODE_SIZE (mode) > GET_MODE_SIZE (found_mode))
       found_mode = mode;

   if (found_mode != VOIDmode)


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-01-16 14:58 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-01-15 13:20 Re:: [PATCH, reginfo.c, i386.c] Backport fix for PR58139 to 4.8 Peter Bergner
2014-01-16  8:11 ` : " Uros Bizjak
2014-01-16 12:40   ` Peter Bergner
2014-01-16 12:49     ` Uros Bizjak
2014-01-16 14:58       ` Peter Bergner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).