cselib: Fix endless cselib loop on (plus:P (reg) (const_int 0))
authorJakub Jelinek <jakub@redhat.com>
Mon, 6 Apr 2020 22:27:10 +0000 (00:27 +0200)
committerJakub Jelinek <jakub@redhat.com>
Mon, 6 Apr 2020 22:27:10 +0000 (00:27 +0200)
getopt.c hangs the compiler on h8300-elf with -O2 -g, because the
IL contains addition of constant 0, the first PLUS operand is determined
to have the SP_DERIVED_VALUE_P and the new code in cselib recurses
indefinitely on seeing SP_DERIVED_VALUE_P with locs of
(plus:P SP_DERIVED_VALUE_P (const_int 0)).

Fixed by making sure cselib_subst_to_values canonicalizes it, hashing
already hashes it the same too.

2020-04-06  Jakub Jelinek  <jakub@redhat.com>

* cselib.c (cselib_subst_to_values): For SP_DERIVED_VALUE_P
+ const0_rtx return the SP_DERIVED_VALUE_P.

gcc/ChangeLog
gcc/cselib.c

index 258e9dbc9568b0c5e5b12824b233e70e23ff2e17..40707325765086a52ecdb73f572ca1b970250d5d 100644 (file)
@@ -1,3 +1,8 @@
+2020-04-06  Jakub Jelinek  <jakub@redhat.com>
+
+       * cselib.c (cselib_subst_to_values): For SP_DERIVED_VALUE_P
+       + const0_rtx return the SP_DERIVED_VALUE_P.
+
 2020-04-06  Richard Sandiford  <richard.sandiford@arm.com>
 
        PR rtl-optimization/92989
index 256bd7852070b0d7ab8224ffa58bd451b144a9f6..69c9ca5b211cbc9f5c6403dcadb5f943bfdc66f9 100644 (file)
@@ -2090,13 +2090,17 @@ cselib_subst_to_values (rtx x, machine_mode memmode)
        {
          rtx t = cselib_subst_to_values (XEXP (x, 0), memmode);
          if (GET_CODE (t) == VALUE)
-           for (struct elt_loc_list *l = CSELIB_VAL_PTR (t)->locs;
-                l; l = l->next)
-             if (GET_CODE (l->loc) == PLUS
-                 && GET_CODE (XEXP (l->loc, 0)) == VALUE
-                 && SP_DERIVED_VALUE_P (XEXP (l->loc, 0))
-                 && CONST_INT_P (XEXP (l->loc, 1)))
-               return plus_constant (Pmode, l->loc, INTVAL (XEXP (x, 1)));
+           {
+             if (SP_DERIVED_VALUE_P (t) && XEXP (x, 1) == const0_rtx)
+               return t;
+             for (struct elt_loc_list *l = CSELIB_VAL_PTR (t)->locs;
+                  l; l = l->next)
+               if (GET_CODE (l->loc) == PLUS
+                   && GET_CODE (XEXP (l->loc, 0)) == VALUE
+                   && SP_DERIVED_VALUE_P (XEXP (l->loc, 0))
+                   && CONST_INT_P (XEXP (l->loc, 1)))
+                 return plus_constant (Pmode, l->loc, INTVAL (XEXP (x, 1)));
+           }
          if (t != XEXP (x, 0))
            {
              copy = shallow_copy_rtx (x);