Re: RFA[powerpc]: patch to fix PR79916

2018-04-13 Thread Vladimir Makarov



On 04/13/2018 05:26 PM, Segher Boessenkool wrote:

Hi!

On Fri, Apr 13, 2018 at 04:43:02PM -0400, Vladimir Makarov wrote:

On 04/13/2018 03:58 PM, Alexander Monakov wrote:

Here's another compact variant:

  regno = reg_renumber[regno];
  if (regno < 0)
regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];


Thanks, Alexander.  I like your variant more.

Me too :-)


--- testsuite/gcc.target/powerpc/pr79916.c  (nonexistent)
+++ testsuite/gcc.target/powerpc/pr79916.c  (working copy)
@@ -0,0 +1,556 @@
+/* { dg-do compile  { target { powerpc64le-*-* } } } */

Is the testcase specific to LE?  If not, please use powerpc*-*-*, or
powerpc*-*-* && lp64  if it needs 64-bit.

I've just tried powerpc64 BE and powerpc.  The bug is reproducible 
everywhere.  So I change it to powerpc*-*-*

+/* { dg-options "-Idfp -fno-expensive-optimizations --param 
ira-max-conflict-table-size=0 -mno-popcntd -O3" } */

I think you can drop the -Idfp ?  If that option would do anything we
have bigger problems ;-)

I removed it.

Looks fine to me otherwise.  Thanks for working on this!



Thank you for the quick review.

I committed the patch to trunk (rev. 259379).

The final variant is in the attachment.

Index: ChangeLog
===
--- ChangeLog	(revision 259378)
+++ ChangeLog	(working copy)
@@ -1,3 +1,10 @@
+2018-04-13  Vladimir Makarov  
+
+	PR rtl-optimization/79916
+	* config/rs6000/rs6000.c (rs6000_emit_move): Use assigned hard
+	regs (if any) to define how to gnerate SD moves when LRA is in
+	progress.
+
 2018-04-13  Jakub Jelinek  
 
 	PR rtl-optimization/85393
Index: testsuite/ChangeLog
===
--- testsuite/ChangeLog	(revision 259378)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2018-04-13  Vladimir Makarov  
+
+	PR rtl-optimization/79916
+	* gcc.target/powerpc/pr79916.c: New.
+
 2018-04-13  Jakub Jelinek  
 
 	PR rtl-optimization/85393
Index: config/rs6000/rs6000.c
===
--- config/rs6000/rs6000.c	(revision 259330)
+++ config/rs6000/rs6000.c	(working copy)
@@ -10610,7 +10610,9 @@ rs6000_emit_move (rtx dest, rtx source,
   if (regno >= FIRST_PSEUDO_REGISTER)
 	{
 	  cl = reg_preferred_class (regno);
-	  regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
 	}
   if (regno >= 0 && ! FP_REGNO_P (regno))
 	{
@@ -10635,7 +10637,9 @@ rs6000_emit_move (rtx dest, rtx source,
 	{
 	  cl = reg_preferred_class (regno);
 	  gcc_assert (cl != NO_REGS);
-	  regno = ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = ira_class_hard_regs[cl][0];
 	}
   if (FP_REGNO_P (regno))
 	{
@@ -10664,7 +10668,9 @@ rs6000_emit_move (rtx dest, rtx source,
   if (regno >= FIRST_PSEUDO_REGISTER)
 	{
 	  cl = reg_preferred_class (regno);
-	  regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
 	}
   if (regno >= 0 && ! FP_REGNO_P (regno))
 	{
@@ -10689,7 +10695,9 @@ rs6000_emit_move (rtx dest, rtx source,
 	{
 	  cl = reg_preferred_class (regno);
 	  gcc_assert (cl != NO_REGS);
-	  regno = ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = ira_class_hard_regs[cl][0];
 	}
   if (FP_REGNO_P (regno))
 	{
Index: testsuite/gcc.target/powerpc/pr79916.c
===
--- testsuite/gcc.target/powerpc/pr79916.c	(nonexistent)
+++ testsuite/gcc.target/powerpc/pr79916.c	(working copy)
@@ -0,0 +1,556 @@
+/* { dg-do compile  { target { powerpc*-*-* } } } */
+/* { dg-options "-fno-expensive-optimizations --param ira-max-conflict-table-size=0 -mno-popcntd -O3" } */
+
+#define PASTE2(A,B) A ## B
+#define PASTE(A,B) PASTE2(A,B)
+
+#define TESTVAL_NEG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  si = VAL;\
+  sll = PASTE(VAL,LL);			\
+  a = si;\
+  b = sll;\
+  c = VAL;\
+  d = PASTE(VAL,LL);			\
+  if ((__builtin_memcmp ((void *)&x, (void *)&a, SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&b,SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&c,SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&d,SIZE) != 0))		\
+__builtin_abort ();
+
+#define TESTVAL_NEG_BIG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  sll = PASTE(VAL,LL);			\
+  a = sll;\
+  b = PASTE(VAL,LL);			\
+  if ((__builtin_memcmp ((void *)&x, (void *)&a, SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&b,SIZE) != 0))		\
+__builtin_abort ();
+
+#define TESTVAL_NONNEG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  si = V

Re: RFA[powerpc]: patch to fix PR79916

2018-04-13 Thread Segher Boessenkool
Hi!

On Fri, Apr 13, 2018 at 04:43:02PM -0400, Vladimir Makarov wrote:
> On 04/13/2018 03:58 PM, Alexander Monakov wrote:
> >Here's another compact variant:
> >
> >   regno = reg_renumber[regno];
> >   if (regno < 0)
> > regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
> >
> Thanks, Alexander.  I like your variant more.

Me too :-)

> --- testsuite/gcc.target/powerpc/pr79916.c(nonexistent)
> +++ testsuite/gcc.target/powerpc/pr79916.c(working copy)
> @@ -0,0 +1,556 @@
> +/* { dg-do compile  { target { powerpc64le-*-* } } } */

Is the testcase specific to LE?  If not, please use powerpc*-*-*, or
powerpc*-*-* && lp64  if it needs 64-bit.

> +/* { dg-options "-Idfp -fno-expensive-optimizations --param 
> ira-max-conflict-table-size=0 -mno-popcntd -O3" } */

I think you can drop the -Idfp ?  If that option would do anything we
have bigger problems ;-)

Looks fine to me otherwise.  Thanks for working on this!


Segher


Re: RFA[powerpc]: patch to fix PR79916

2018-04-13 Thread Vladimir Makarov



On 04/13/2018 03:58 PM, Alexander Monakov wrote:

On Fri, 13 Apr 2018, Jakub Jelinek wrote:

  if (reg_renumber[regno] >= 0)
regno = reg_renumber[regno];
  else
regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
or
  regno = (reg_renumber[regno] >= 0
   ? reg_renumber[regno]
   : cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1]);
is better, the latter is perhaps more compact.

Here's another compact variant:

  regno = reg_renumber[regno];
  if (regno < 0)
regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];


Thanks, Alexander.  I like your variant more.

Sorry for forgetting GNU standard (it might happen when you are working 
on a few different projects simultaneously).


The revised patch is in the attachment.

Index: ChangeLog
===
--- ChangeLog	(revision 259376)
+++ ChangeLog	(working copy)
@@ -1,3 +1,10 @@
+2018-04-13  Vladimir Makarov  
+
+	PR rtl-optimization/79916
+	* config/rs6000/rs6000.c (rs6000_emit_move): Use assigned hard
+	regs (if any) to define how to gnerate SD moves when LRA is in
+	progress.
+
 2018-04-13  Jan Hubicka  
 	Bin Cheng  
 
Index: testsuite/ChangeLog
===
--- testsuite/ChangeLog	(revision 259376)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@
+2018-04-13  Vladimir Makarov  
+
+	PR rtl-optimization/79916
+	* gcc.target/powerpc/pr79916.c: New.
+
 2018-04-13  Andrey Belevantsev  
 
 	PR rtl-optimization/83852
Index: config/rs6000/rs6000.c
===
--- config/rs6000/rs6000.c	(revision 259330)
+++ config/rs6000/rs6000.c	(working copy)
@@ -10610,7 +10610,9 @@ rs6000_emit_move (rtx dest, rtx source,
   if (regno >= FIRST_PSEUDO_REGISTER)
 	{
 	  cl = reg_preferred_class (regno);
-	  regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
 	}
   if (regno >= 0 && ! FP_REGNO_P (regno))
 	{
@@ -10635,7 +10637,9 @@ rs6000_emit_move (rtx dest, rtx source,
 	{
 	  cl = reg_preferred_class (regno);
 	  gcc_assert (cl != NO_REGS);
-	  regno = ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = ira_class_hard_regs[cl][0];
 	}
   if (FP_REGNO_P (regno))
 	{
@@ -10664,7 +10668,9 @@ rs6000_emit_move (rtx dest, rtx source,
   if (regno >= FIRST_PSEUDO_REGISTER)
 	{
 	  cl = reg_preferred_class (regno);
-	  regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
 	}
   if (regno >= 0 && ! FP_REGNO_P (regno))
 	{
@@ -10689,7 +10695,9 @@ rs6000_emit_move (rtx dest, rtx source,
 	{
 	  cl = reg_preferred_class (regno);
 	  gcc_assert (cl != NO_REGS);
-	  regno = ira_class_hard_regs[cl][0];
+	  regno = reg_renumber[regno];
+	  if (regno < 0)
+	regno = ira_class_hard_regs[cl][0];
 	}
   if (FP_REGNO_P (regno))
 	{
Index: testsuite/gcc.target/powerpc/pr79916.c
===
--- testsuite/gcc.target/powerpc/pr79916.c	(nonexistent)
+++ testsuite/gcc.target/powerpc/pr79916.c	(working copy)
@@ -0,0 +1,556 @@
+/* { dg-do compile  { target { powerpc64le-*-* } } } */
+/* { dg-options "-Idfp -fno-expensive-optimizations --param ira-max-conflict-table-size=0 -mno-popcntd -O3" } */
+
+#define PASTE2(A,B) A ## B
+#define PASTE(A,B) PASTE2(A,B)
+
+#define TESTVAL_NEG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  si = VAL;\
+  sll = PASTE(VAL,LL);			\
+  a = si;\
+  b = sll;\
+  c = VAL;\
+  d = PASTE(VAL,LL);			\
+  if ((__builtin_memcmp ((void *)&x, (void *)&a, SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&b,SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&c,SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&d,SIZE) != 0))		\
+__builtin_abort ();
+
+#define TESTVAL_NEG_BIG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  sll = PASTE(VAL,LL);			\
+  a = sll;\
+  b = PASTE(VAL,LL);			\
+  if ((__builtin_memcmp ((void *)&x, (void *)&a, SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (void *)&b,SIZE) != 0))		\
+__builtin_abort ();
+
+#define TESTVAL_NONNEG(VAL,SUF,SIZE)	\
+  x = PASTE(PASTE(VAL,.),SUF);		\
+  si = VAL;\
+  ui = VAL;\
+  sll = PASTE(VAL,LL);			\
+  ull = PASTE(VAL,ULL);			\
+  a = si;\
+  b = sll;\
+  c = ui;\
+  d = ull;\
+  e = VAL;\
+  f = VAL;\
+  g = PASTE(VAL,LL);			\
+  h = PASTE(VAL,ULL);			\
+  if ((__builtin_memcmp ((void *)&x, (void *)&a, SIZE) != 0)		\
+  || (__builtin_memcmp ((void *)&x, (

Re: RFA[powerpc]: patch to fix PR79916

2018-04-13 Thread Alexander Monakov
On Fri, 13 Apr 2018, Jakub Jelinek wrote:
> if (reg_renumber[regno] >= 0)
>   regno = reg_renumber[regno];
> else
>   regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
> or
> regno = (reg_renumber[regno] >= 0
>  ? reg_renumber[regno]
>  : cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1]);
> is better, the latter is perhaps more compact.

Here's another compact variant:

  regno = reg_renumber[regno];
  if (regno < 0)
regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];

Alexander


Re: RFA[powerpc]: patch to fix PR79916

2018-04-13 Thread Jakub Jelinek
On Fri, Apr 13, 2018 at 03:29:47PM -0400, Vladimir Makarov wrote:
>   The attached patch fixes
> 
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79916
> 
>   The PR is about LRA cycling on some tests when SD data are used.  The
> problem was in that actual assigned reg to pseudo was not in the pseudo
> preferred class and this resulted in wrong generated code which LRA tried to
> change again and again.
> 
>   The patch was successfully bootstrapped and tested on ppc64 (gcc110).
> 
>   Is it ok to commit?

I have just formatting nits and will defer the actual review to the PowerPC
maintainers.  The nit is that all the lines are too long.
Not sure if
  if (reg_renumber[regno] >= 0)
regno = reg_renumber[regno];
  else
regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
or
  regno = (reg_renumber[regno] >= 0
   ? reg_renumber[regno]
   : cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1]);
is better, the latter is perhaps more compact.

> --- config/rs6000/rs6000.c(revision 259330)
> +++ config/rs6000/rs6000.c(working copy)
> @@ -10610,7 +10610,7 @@ rs6000_emit_move (rtx dest, rtx source,
>if (regno >= FIRST_PSEUDO_REGISTER)
>   {
> cl = reg_preferred_class (regno);
> -   regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][1];
> +   regno = reg_renumber[regno] >= 0 ? reg_renumber[regno] : cl == 
> NO_REGS ? -1 : ira_class_hard_regs[cl][1];
>   }
>if (regno >= 0 && ! FP_REGNO_P (regno))
>   {
> @@ -10635,7 +10635,7 @@ rs6000_emit_move (rtx dest, rtx source,
>   {
> cl = reg_preferred_class (regno);
> gcc_assert (cl != NO_REGS);
> -   regno = ira_class_hard_regs[cl][0];
> +   regno = reg_renumber[regno] >= 0 ? reg_renumber[regno] : 
> ira_class_hard_regs[cl][0];
>   }
>if (FP_REGNO_P (regno))
>   {
> @@ -10664,7 +10664,7 @@ rs6000_emit_move (rtx dest, rtx source,
>if (regno >= FIRST_PSEUDO_REGISTER)
>   {
> cl = reg_preferred_class (regno);
> -   regno = cl == NO_REGS ? -1 : ira_class_hard_regs[cl][0];
> +   regno = reg_renumber[regno] >= 0 ? reg_renumber[regno] : cl == 
> NO_REGS ? -1 : ira_class_hard_regs[cl][0];
>   }
>if (regno >= 0 && ! FP_REGNO_P (regno))
>   {
> @@ -10689,7 +10689,7 @@ rs6000_emit_move (rtx dest, rtx source,
>   {
> cl = reg_preferred_class (regno);
> gcc_assert (cl != NO_REGS);
> -   regno = ira_class_hard_regs[cl][0];
> +   regno = reg_renumber[regno] >= 0 ? reg_renumber[regno] : 
> ira_class_hard_regs[cl][0];
>   }
>if (FP_REGNO_P (regno))
>   {

Jakub