re PR bootstrap/51725 (segfault in stage 3 when compiling gcc/opts.c for sparc64...
authorJakub Jelinek <jakub@redhat.com>
Tue, 3 Jan 2012 20:57:29 +0000 (21:57 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 3 Jan 2012 20:57:29 +0000 (21:57 +0100)
PR bootstrap/51725
* cselib.c (new_elt_loc_list): When moving locs from one
cselib_val to its new canonical_cselib_val and the
cselib_val was in first_containing_mem chain, but
the canonical_cselib_val was not, add the latter into the
chain.
(cselib_invalidate_mem): Compare canonical_cselib_val of
addr_list chain elt with v.

From-SVN: r182858

gcc/ChangeLog
gcc/cselib.c

index e5f0b66346d5cb2fb29626cd0b2e175125ecea64..b4c5fa1cf5753e229184151e359b80427f54c65b 100644 (file)
@@ -1,5 +1,14 @@
 2012-01-03  Jakub Jelinek  <jakub@redhat.com>
 
+       PR bootstrap/51725
+       * cselib.c (new_elt_loc_list): When moving locs from one
+       cselib_val to its new canonical_cselib_val and the
+       cselib_val was in first_containing_mem chain, but
+       the canonical_cselib_val was not, add the latter into the
+       chain.
+       (cselib_invalidate_mem): Compare canonical_cselib_val of
+       addr_list chain elt with v.
+
        PR pch/51722
        * dwarf2out.c (dwarf2out_start_source_file, dwarf2out_define,
        dwarf2out_undef): Allocate e.info using ggc_strdup instead
index fc86ef1affeb33955bd832b23fb3889e94c0b5cb..9934abb8f41fc95af8637d255fd2b8b7628a5ab6 100644 (file)
@@ -277,6 +277,12 @@ new_elt_loc_list (cselib_val *val, rtx loc)
            }
          el->next = val->locs;
          next = val->locs = CSELIB_VAL_PTR (loc)->locs;
+         if (CSELIB_VAL_PTR (loc)->next_containing_mem != NULL
+             && val->next_containing_mem == NULL)
+           {
+             val->next_containing_mem = first_containing_mem;
+             first_containing_mem = val;
+           }
        }
 
       /* Chain LOC back to VAL.  */
@@ -2211,7 +2217,7 @@ cselib_invalidate_mem (rtx mem_rtx)
          mem_chain = &addr->addr_list;
          for (;;)
            {
-             if ((*mem_chain)->elt == v)
+             if (canonical_cselib_val ((*mem_chain)->elt) == v)
                {
                  unchain_one_elt_list (mem_chain);
                  break;