re PR rtl-optimization/79949 (ICE in Max. number of generated reload insns per insn...
authorVladimir Makarov <vmakarov@redhat.com>
Thu, 9 Mar 2017 14:43:17 +0000 (14:43 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Thu, 9 Mar 2017 14:43:17 +0000 (14:43 +0000)
2017-03-09  Vladimir Makarov  <vmakarov@redhat.com>

PR rtl-optimization/79949
* lra-constraints.c (process_alt_operands): Check memory when
trying to predict a cycle.  Print about the overall increase.

From-SVN: r246003

gcc/ChangeLog
gcc/lra-constraints.c

index 7eab042..7c0bb71 100644 (file)
@@ -1,3 +1,9 @@
+2017-03-09  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/79949
+       * lra-constraints.c (process_alt_operands): Check memory when
+       trying to predict a cycle.  Print about the overall increase.
+
 2017-03-09  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/79971
index 630261a..e0ce807 100644 (file)
@@ -2766,13 +2766,15 @@ process_alt_operands (int only_alternative)
                  && REG_P (no_subreg_reg_operand[1])
                  /* Check that we reload memory not the memory
                     address.  */
-                 && !curr_alt_offmemok[0]
+                 && ! (curr_alt_offmemok[0]
+                       && MEM_P (no_subreg_reg_operand[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]
+                 && ! (curr_alt_offmemok[1]
+                       && MEM_P (no_subreg_reg_operand[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])
@@ -2785,8 +2787,11 @@ process_alt_operands (int only_alternative)
                  && GET_CODE (no_subreg_reg_operand[1]) != PLUS)))
        {
          /* We have a move insn and a new reload insn will be similar
-            to the current insn.  We should avoid such situation as it
-            results in LRA cycling.  */
+            to the current insn.  We should avoid such situation as
+            it results in LRA cycling.  */
+         if (lra_dump_file != NULL)
+           fprintf (lra_dump_file,
+                    "            Cycle danger: overall += LRA_MAX_REJECT\n");
          overall += LRA_MAX_REJECT;
        }
       ok_p = true;