summaryrefslogtreecommitdiff
path: root/gcc/reload1.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-10 13:48:00 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2000-10-10 13:48:00 +0000
commit7a45336a91b1c8563d4b253492616d3fb92f2045 (patch)
treea27adfd9d1b26eca318d1c895309a35246141b90 /gcc/reload1.c
parent5b3762ed2fd12c86d2643b0ac9a4d209609e77f7 (diff)
downloadgcc-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.c15
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;
}
}