Hi!

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.

Bootstrapped/regtested on x86_64-linux and i686-linux, tested on the
getopt.i testcase using cross to h8300-elf, approved off-list by Jeff,
committed to trunk.

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

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

--- gcc/cselib.c.jj     2020-04-04 10:31:15.409783959 +0200
+++ gcc/cselib.c        2020-04-06 12:05:46.055767835 +0200
@@ -2090,13 +2090,17 @@ cselib_subst_to_values (rtx x, machine_m
        {
          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);

        Jakub

Reply via email to