diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-10 13:48:00 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2000-10-10 13:48:00 +0000 |
commit | 7a45336a91b1c8563d4b253492616d3fb92f2045 (patch) | |
tree | a27adfd9d1b26eca318d1c895309a35246141b90 /gcc/reload1.c | |
parent | 5b3762ed2fd12c86d2643b0ac9a4d209609e77f7 (diff) | |
download | gcc-7a45336a91b1c8563d4b253492616d3fb92f2045.tar.gz |
* reload1.c (calculate_needs_all_insns): If deleting an instruction,
remove its insn_chain structure as well.
* gcc.dg/20001009-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@36824 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/reload1.c')
-rw-r--r-- | gcc/reload1.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/reload1.c b/gcc/reload1.c index c556265f312..803fd010faf 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -1330,15 +1330,17 @@ calculate_needs_all_insns (global) int global; { struct insn_chain **pprev_reload = &insns_need_reload; - struct insn_chain *chain; + struct insn_chain *chain, *next = 0; something_needs_elimination = 0; reload_insn_firstobj = (char *) obstack_alloc (&reload_obstack, 0); - for (chain = reload_insn_chain; chain != 0; chain = chain->next) + for (chain = reload_insn_chain; chain != 0; chain = next) { rtx insn = chain->insn; + next = chain->next; + /* Clear out the shortcuts. */ chain->n_reloads = 0; chain->need_elim = 0; @@ -1394,6 +1396,15 @@ calculate_needs_all_insns (global) PUT_CODE (insn, NOTE); NOTE_SOURCE_FILE (insn) = 0; NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; + /* Delete it from the reload chain */ + if (chain->prev) + chain->prev->next = next; + else + reload_insn_chain = next; + if (next) + next->prev = chain->prev; + chain->next = unused_insn_chains; + unused_insn_chains = chain; continue; } } |