re PR rtl-optimization/79571 (ICE in Max. number of generated reload insns per insn...
authorVladimir Makarov <vmakarov@redhat.com>
Mon, 6 Mar 2017 20:23:00 +0000 (20:23 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Mon, 6 Mar 2017 20:23:00 +0000 (20:23 +0000)
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  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/79571
* gcc.target/i386/pr79571.c: New.

From-SVN: r245928

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr79571.c [new file with mode: 0644]

index 05001aa26e820218ac398a0fbeed55541570e4e8..2ddff45eabd7f0d8f7965bfbeb356dc2be128e5a 100644 (file)
@@ -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 c67bd0633f377d7e74ff4e27a7b70340ab17990c..630261a6dfab5659da7366e519b069690cc6a3f2 100644 (file)
@@ -1867,11 +1867,15 @@ process_alt_operands (int only_alternative)
   /* 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_alternative)
       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_alternative)
          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_alternative)
                       nop);
                  reject++;
                }
+
+             if (MEM_P (op) && offmemok)
+               addr_losers++;
            }
 
          if (early_clobber_p && ! scratch_p)
@@ -2718,7 +2727,8 @@ process_alt_operands (int only_alternative)
             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_alternative)
          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_alternative)
                   || 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 445e4141408ec74f8af02dcd0fd2753f750873be..2f27e4b535c519ceabeabbad9624f7a4df78cb87 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gcc.target/i386/pr79571.c b/gcc/testsuite/gcc.target/i386/pr79571.c
new file mode 100644 (file)
index 0000000..4595a1a
--- /dev/null
@@ -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;
+}