diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 7 | ||||
-rw-r--r-- | gcc/flow.c | 12 |
3 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ba7d040..32c5848 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-07-28 Jan Hubicka <jh@suse.cz> + + PR rtl-optimization/28071 + * cfgrtl.c (rtl_delete_block): Free regsets. + * flow.c (allocate_bb_life_data): Re-use regsets if available. + 2006-07-28 Volker Reichelt <reichelt@igpm.rwth-aachen.de> * Makefile.in: Use $(HEADER_H) instead of header.h in dependencies diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 723e323..b07bb94 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -386,6 +386,13 @@ rtl_delete_block (basic_block b) /* Selectively delete the entire chain. */ BB_HEAD (b) = NULL; delete_insn_chain (insn, end); + if (b->il.rtl->global_live_at_start) + { + FREE_REG_SET (b->il.rtl->global_live_at_start); + FREE_REG_SET (b->il.rtl->global_live_at_end); + b->il.rtl->global_live_at_start = NULL; + b->il.rtl->global_live_at_end = NULL; + } } /* Records the basic block struct in BLOCK_FOR_INSN for every insn. */ @@ -1564,8 +1564,16 @@ allocate_bb_life_data (void) FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb) { - bb->il.rtl->global_live_at_start = ALLOC_REG_SET (®_obstack); - bb->il.rtl->global_live_at_end = ALLOC_REG_SET (®_obstack); + if (bb->il.rtl->global_live_at_start) + { + CLEAR_REG_SET (bb->il.rtl->global_live_at_start); + CLEAR_REG_SET (bb->il.rtl->global_live_at_end); + } + else + { + bb->il.rtl->global_live_at_start = ALLOC_REG_SET (®_obstack); + bb->il.rtl->global_live_at_end = ALLOC_REG_SET (®_obstack); + } } regs_live_at_setjmp = ALLOC_REG_SET (®_obstack); |