diff options
| author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-04-04 20:19:23 +0000 |
|---|---|---|
| committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-04-04 20:19:23 +0000 |
| commit | 94563e2431974f5b1441bf07fbac70ff5c3a4751 (patch) | |
| tree | 7aef91698117ee2beec54a5b9d64e2c363eded79 /gcc | |
| parent | 072ca35543eb34f764008aea4cf7cc341a1c97b4 (diff) | |
| download | ppe42-gcc-94563e2431974f5b1441bf07fbac70ff5c3a4751.tar.gz ppe42-gcc-94563e2431974f5b1441bf07fbac70ff5c3a4751.zip | |
* gcse.c (delete_null_pointer_checks_1): Add delete_list argument,
push insns to delete to it instead of deleting them.
(delete_null_pointer_checks): Delete insns from delete_list after
all delete_null_pointer_checks_1 passes are done.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41092 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/ChangeLog | 7 | ||||
| -rw-r--r-- | gcc/gcse.c | 27 |
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c4656938ea1..452d6f56578 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-04-04 Jakub Jelinek <jakub@redhat.com> + + * gcse.c (delete_null_pointer_checks_1): Add delete_list argument, + push insns to delete to it instead of deleting them. + (delete_null_pointer_checks): Delete insns from delete_list after + all delete_null_pointer_checks_1 passes are done. + 2001-04-04 Richard Henderson <rth@redhat.com> * configure.in (gcc_cv_as_leb128): Tweek minor number extraction. diff --git a/gcc/gcse.c b/gcc/gcse.c index 9eda522e859..f060a8e8875 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -628,8 +628,8 @@ static int handle_avail_expr PARAMS ((rtx, struct expr *)); static int classic_gcse PARAMS ((void)); static int one_classic_gcse_pass PARAMS ((int)); static void invalidate_nonnull_info PARAMS ((rtx, rtx, void *)); -static void delete_null_pointer_checks_1 PARAMS ((unsigned int *, sbitmap *, - sbitmap *, +static void delete_null_pointer_checks_1 PARAMS ((varray_type *, unsigned int *, + sbitmap *, sbitmap *, struct null_pointer_info *)); static rtx process_insert_insn PARAMS ((struct expr *)); static int pre_edge_insert PARAMS ((struct edge_list *, struct expr **)); @@ -4972,7 +4972,9 @@ invalidate_nonnull_info (x, setter, data) they are not our responsibility to free. */ static void -delete_null_pointer_checks_1 (block_reg, nonnull_avin, nonnull_avout, npi) +delete_null_pointer_checks_1 (delete_list, block_reg, nonnull_avin, + nonnull_avout, npi) + varray_type *delete_list; unsigned int *block_reg; sbitmap *nonnull_avin; sbitmap *nonnull_avout; @@ -5102,9 +5104,12 @@ delete_null_pointer_checks_1 (block_reg, nonnull_avin, nonnull_avout, npi) LABEL_NUSES (JUMP_LABEL (new_jump))++; emit_barrier_after (new_jump); } - delete_insn (last_insn); + if (!*delete_list) + VARRAY_RTX_INIT (*delete_list, 10, "delete_list"); + + VARRAY_PUSH_RTX (*delete_list, last_insn); if (compare_and_branch == 2) - delete_insn (earliest); + VARRAY_PUSH_RTX (*delete_list, earliest); /* Don't check this block again. (Note that BLOCK_END is invalid here; we deleted the last instruction in the @@ -5143,10 +5148,12 @@ delete_null_pointer_checks (f) { sbitmap *nonnull_avin, *nonnull_avout; unsigned int *block_reg; + varray_type delete_list = NULL; int bb; int reg; int regs_per_pass; int max_reg; + unsigned int i; struct null_pointer_info npi; /* If we have only a single block, then there's nothing to do. */ @@ -5215,10 +5222,18 @@ delete_null_pointer_checks (f) { npi.min_reg = reg; npi.max_reg = MIN (reg + regs_per_pass, max_reg); - delete_null_pointer_checks_1 (block_reg, nonnull_avin, + delete_null_pointer_checks_1 (&delete_list, block_reg, nonnull_avin, nonnull_avout, &npi); } + /* Now delete the instructions all at once. This breaks the CFG. */ + if (delete_list) + { + for (i = 0; i < VARRAY_ACTIVE_SIZE (delete_list); i++) + delete_insn (VARRAY_RTX (delete_list, i)); + VARRAY_FREE (delete_list); + } + /* Free the table of registers compared at the end of every block. */ free (block_reg); |

