diff options
author | Jakub Jelinek <jakub@redhat.com> | 2012-01-03 21:57:29 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2012-01-03 21:57:29 +0100 |
commit | e30afafbbf5b4cf462c68c3e9e172c5989c7d85d (patch) | |
tree | d967239510b2c4cc283c3acfced9687d6cd9c178 | |
parent | 346afd846bbed003f8b35d927a319d7f29f87138 (diff) | |
download | gcc-e30afafbbf5b4cf462c68c3e9e172c5989c7d85d.zip gcc-e30afafbbf5b4cf462c68c3e9e172c5989c7d85d.tar.gz gcc-e30afafbbf5b4cf462c68c3e9e172c5989c7d85d.tar.bz2 |
re PR bootstrap/51725 (segfault in stage 3 when compiling gcc/opts.c for sparc64-linux)
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
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cselib.c | 8 |
2 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e5f0b66..b4c5fa1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cselib.c b/gcc/cselib.c index fc86ef1..9934abb 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -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; |