diff mbox

patch to fix PR79571

Message ID 83e24286-51f4-3035-0f8e-01b35c3da554@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov March 6, 2017, 8:26 p.m. UTC
A patch in the attachment fixes

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79571

The patch was successfully bootstrapped and tested on x86-64.

Committed as rev. 245928

Comments

Vladimir Makarov March 6, 2017, 8:31 p.m. UTC | #1
Sorry the ChangeLog entry had typos.  Here is the final variant

2017-03-06  Vladimir Makarov  <vmakarov@redhat.com>

         PR rtl-optimization/79571
         * lra-constraints.c (process_alt_operands): Calculate static
         reject and subtract it from overall when only addresses will be
         reloaded.
Jakub Jelinek March 6, 2017, 8:35 p.m. UTC | #2
On Mon, Mar 06, 2017 at 03:31:49PM -0500, Vladimir Makarov wrote:
> 
> Sorry the ChangeLog entry had typos.  Here is the final variant
> 
> 2017-03-06  Vladimir Makarov  <vmakarov@redhat.com>
> 
>         PR rtl-optimization/79571
>         * lra-constraints.c (process_alt_operands): Calculate static

One more: Calculate ?

>         reject and subtract it from overall when only addresses will be
>         reloaded.

	Jakub
Jakub Jelinek March 6, 2017, 8:35 p.m. UTC | #3
On Mon, Mar 06, 2017 at 09:35:08PM +0100, Jakub Jelinek wrote:
> On Mon, Mar 06, 2017 at 03:31:49PM -0500, Vladimir Makarov wrote:
> > 
> > Sorry the ChangeLog entry had typos.  Here is the final variant
> > 
> > 2017-03-06  Vladimir Makarov  <vmakarov@redhat.com>
> > 
> >         PR rtl-optimization/79571
> >         * lra-constraints.c (process_alt_operands): Calculate static
> 
> One more: Calculate ?

Ignore me, too tired.

> >         reject and subtract it from overall when only addresses will be
> >         reloaded.

	Jakub
diff mbox

Patch

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 245927)
+++ ChangeLog	(working copy)
@@ -1,3 +1,10 @@ 
+2017-03-06  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR rtl-optimization/79571
+	* lra-constraints.c (process_alt_operands): Claculate static
+	reject and subtract it from overal when there will be only address
+	reloads.
+
 2017-03-06  Julia Koval  <julia.koval@intel.com>
 
 	PR target/79793
Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 245843)
+++ lra-constraints.c	(working copy)
@@ -1867,11 +1867,15 @@  process_alt_operands (int only_alternati
   /* LOSERS counts the operands that don't fit this alternative and
      would require loading.  */
   int losers;
+  int addr_losers;
   /* REJECT is a count of how undesirable this alternative says it is
      if any reloading is required.  If the alternative matches exactly
      then REJECT is ignored, but otherwise it gets this much counted
      against it in addition to the reloading needed.  */
   int reject;
+  /* This is defined by '!' or '?' alternative constraint and added to
+     reject.  But in some cases it can be ignored.  */
+  int static_reject;
   int op_reject;
   /* The number of elements in the following array.  */
   int early_clobbered_regs_num;
@@ -1948,7 +1952,8 @@  process_alt_operands (int only_alternati
       if (!TEST_BIT (preferred, nalt))
 	continue;
 
-      overall = losers = reject = reload_nregs = reload_sum = 0;
+      overall = losers = addr_losers = 0;
+      static_reject = reject = reload_nregs = reload_sum = 0;
       for (nop = 0; nop < n_operands; nop++)
 	{
 	  int inc = (curr_static_id
@@ -1956,8 +1961,9 @@  process_alt_operands (int only_alternati
 	  if (lra_dump_file != NULL && inc != 0)
 	    fprintf (lra_dump_file,
 		     "            Staticly defined alt reject+=%d\n", inc);
-	  reject += inc;
+	  static_reject += inc;
 	}
+      reject += static_reject;
       early_clobbered_regs_num = 0;
 
       for (nop = 0; nop < n_operands; nop++)
@@ -2704,6 +2710,9 @@  process_alt_operands (int only_alternati
 		       nop);
 		  reject++;
 		}
+
+	      if (MEM_P (op) && offmemok)
+		addr_losers++;
 	    }
 
 	  if (early_clobber_p && ! scratch_p)
@@ -2718,7 +2727,8 @@  process_alt_operands (int only_alternati
 	     Should we update the cost (may be approximately) here
 	     because of early clobber register reloads or it is a rare
 	     or non-important thing to be worth to do it.  */
-	  overall = losers * LRA_LOSER_COST_FACTOR + reject;
+	  overall = (losers * LRA_LOSER_COST_FACTOR + reject
+		     - (addr_losers == losers ? static_reject : 0));
 	  if ((best_losers == 0 || losers != 0) && best_overall < overall)
             {
               if (lra_dump_file != NULL)
@@ -2742,6 +2752,7 @@  process_alt_operands (int only_alternati
 	  if (early_clobber_p && operand_reg[nop] != NULL_RTX)
 	    early_clobbered_nops[early_clobbered_regs_num++] = nop;
 	}
+
       if (curr_insn_set != NULL_RTX && n_operands == 2
 	  /* Prevent processing non-move insns.  */
 	  && (GET_CODE (SET_SRC (curr_insn_set)) == SUBREG
@@ -2753,9 +2764,15 @@  process_alt_operands (int only_alternati
 		   || reg_in_class_p (no_subreg_reg_operand[1], curr_alt[0])))
 	      || (! curr_alt_win[0] && curr_alt_win[1]
 		  && REG_P (no_subreg_reg_operand[1])
+		  /* Check that we reload memory not the memory
+		     address.  */
+		  && !curr_alt_offmemok[0]
 		  && reg_in_class_p (no_subreg_reg_operand[1], curr_alt[0]))
 	      || (curr_alt_win[0] && ! curr_alt_win[1]
 		  && REG_P (no_subreg_reg_operand[0])
+		  /* Check that we reload memory not the memory
+		     address.  */
+		  && !curr_alt_offmemok[1]
 		  && reg_in_class_p (no_subreg_reg_operand[0], curr_alt[1])
 		  && (! CONST_POOL_OK_P (curr_operand_mode[1],
 					 no_subreg_reg_operand[1])
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(revision 245927)
+++ testsuite/ChangeLog	(working copy)
@@ -1,3 +1,8 @@ 
+2017-03-06  Vladimir Makarov  <vmakarov@redhat.com>
+
+	PR rtl-optimization/79571
+	* gcc.target/i386/pr79571.c: New.
+
 2017-03-06  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/79796 - ICE with NSDMI and this pointer
Index: testsuite/gcc.target/i386/pr79571.c
===================================================================
--- testsuite/gcc.target/i386/pr79571.c	(nonexistent)
+++ testsuite/gcc.target/i386/pr79571.c	(working copy)
@@ -0,0 +1,25 @@ 
+/* PR rtl-optimization/79571 */
+/* { dg-do compile } */
+/* { dg-options "-O -mno-sse -w" } */
+
+struct a
+{
+  int b;
+  int *c
+} h;
+struct d
+{
+  struct a e
+};
+struct fd
+{
+  struct d *d
+} i;
+g;
+j ()
+{
+  unsigned a = g;
+  i = (struct fd){a & 3};
+  struct fd f = i;
+  h = f.d->e;
+}