diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-14 16:25:36 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-06-14 16:25:36 +0000 |
commit | e90391905accdac73e5f34da1ea4a7d97ce179d1 (patch) | |
tree | 72e1faa1b66f9c943d6e2c2fa17de7b0761bbfca | |
parent | fa21d1286ce759993833f865b5307aa55d2fd49d (diff) | |
download | ppe42-gcc-e90391905accdac73e5f34da1ea4a7d97ce179d1.tar.gz ppe42-gcc-e90391905accdac73e5f34da1ea4a7d97ce179d1.zip |
* gcse.c (delete_null_pointer_checks_1): Inform caller if any
null pointer checks were eliminated. Update prototype.
(delete_null_pointer_checks): Similarly.
* rtl.h (delete_null_pointer_checks): Update prototype.
* toplev.c (rest_of_compilation): Only run cleanup_cfg if
delete_null_pointer_checks deletes one or more null
pointer checks. Do not run cleanup_cfg before gcse, the
CFG is accurate and optimized at that point..
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54617 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/gcse.c | 23 | ||||
-rw-r--r-- | gcc/rtl.h | 2 | ||||
-rw-r--r-- | gcc/toplev.c | 11 |
4 files changed, 31 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0109f95e15a..77d95970a19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2002-06-13 Jeffrey Law <law@redhat.com> + * gcse.c (delete_null_pointer_checks_1): Inform caller if any + null pointer checks were eliminated. Update prototype. + (delete_null_pointer_checks): Similarly. + * rtl.h (delete_null_pointer_checks): Update prototype. + * toplev.c (rest_of_compilation): Only run cleanup_cfg if + delete_null_pointer_checks deletes one or more null + pointer checks. Do not run cleanup_cfg before gcse, the + CFG is accurate and optimized at that point.. + * rs6000.c (rs6000_frame_related): Avoid unwanted sharing of hard registers. diff --git a/gcc/gcse.c b/gcc/gcse.c index d390db3f528..f0a7d3bff84 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -658,7 +658,7 @@ 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 *, +static int delete_null_pointer_checks_1 PARAMS ((unsigned int *, sbitmap *, sbitmap *, struct null_pointer_info *)); static rtx process_insert_insn PARAMS ((struct expr *)); @@ -5473,7 +5473,7 @@ invalidate_nonnull_info (x, setter, data) NPI. NONNULL_AVIN and NONNULL_AVOUT are pre-allocated sbitmaps; they are not our responsibility to free. */ -static void +static int delete_null_pointer_checks_1 (block_reg, nonnull_avin, nonnull_avout, npi) unsigned int *block_reg; @@ -5484,6 +5484,7 @@ delete_null_pointer_checks_1 (block_reg, nonnull_avin, basic_block bb, current_block; sbitmap *nonnull_local = npi->nonnull_local; sbitmap *nonnull_killed = npi->nonnull_killed; + int something_changed = 0; /* Compute local properties, nonnull and killed. A register will have the nonnull property if at the end of the current block its value is @@ -5605,6 +5606,7 @@ delete_null_pointer_checks_1 (block_reg, nonnull_avin, emit_barrier_after (new_jump); } + something_changed = 1; delete_insn (last_insn); if (compare_and_branch == 2) delete_insn (earliest); @@ -5615,6 +5617,8 @@ delete_null_pointer_checks_1 (block_reg, nonnull_avin, block.) */ block_reg[bb->index] = 0; } + + return something_changed; } /* Find EQ/NE comparisons against zero which can be (indirectly) evaluated @@ -5641,7 +5645,7 @@ delete_null_pointer_checks_1 (block_reg, nonnull_avin, This could probably be integrated with global cprop with a little work. */ -void +int delete_null_pointer_checks (f) rtx f ATTRIBUTE_UNUSED; { @@ -5652,10 +5656,11 @@ delete_null_pointer_checks (f) int regs_per_pass; int max_reg; struct null_pointer_info npi; + int something_changed = 0; /* If we have only a single block, then there's nothing to do. */ if (n_basic_blocks <= 1) - return; + return 0; /* Trying to perform global optimizations on flow graphs which have a high connectivity will take a long time and is unlikely to be @@ -5666,7 +5671,7 @@ delete_null_pointer_checks (f) a couple switch statements. So we require a relatively large number of basic blocks and the ratio of edges to blocks to be high. */ if (n_basic_blocks > 1000 && n_edges / n_basic_blocks >= 20) - return; + return 0; /* We need four bitmaps, each with a bit for each register in each basic block. */ @@ -5719,8 +5724,10 @@ 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, - nonnull_avout, &npi); + something_changed |= delete_null_pointer_checks_1 (block_reg, + nonnull_avin, + nonnull_avout, + &npi); } /* Free the table of registers compared at the end of every block. */ @@ -5731,6 +5738,8 @@ delete_null_pointer_checks (f) sbitmap_vector_free (npi.nonnull_killed); sbitmap_vector_free (nonnull_avin); sbitmap_vector_free (nonnull_avout); + + return something_changed; } /* Code Hoisting variables and subroutines. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index f198c8d4890..3842426c3d7 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2035,7 +2035,7 @@ extern void reg_scan PARAMS ((rtx, unsigned int, int)); extern void reg_scan_update PARAMS ((rtx, rtx, unsigned int)); extern void fix_register PARAMS ((const char *, int, int)); -extern void delete_null_pointer_checks PARAMS ((rtx)); +extern int delete_null_pointer_checks PARAMS ((rtx)); /* In regmove.c */ #ifdef BUFSIZ diff --git a/gcc/toplev.c b/gcc/toplev.c index c878d57fc75..7965059f37f 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -2729,9 +2729,9 @@ rest_of_compilation (decl) if (rtl_dump_file) dump_flow_info (rtl_dump_file); - delete_null_pointer_checks (insns); + if (delete_null_pointer_checks (insns)) + cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); - cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); close_dump_file (DFI_null, print_rtl_with_bb, insns); } @@ -2775,13 +2775,13 @@ rest_of_compilation (decl) if (tem || optimize > 1) cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); /* Try to identify useless null pointer tests and delete them. */ - if (flag_delete_null_pointer_checks || flag_thread_jumps) + if (flag_delete_null_pointer_checks) { timevar_push (TV_JUMP); if (flag_delete_null_pointer_checks) - delete_null_pointer_checks (insns); - /* CFG is no longer maintained up-to-date. */ + if (delete_null_pointer_checks (insns)) + cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); timevar_pop (TV_JUMP); } @@ -2814,7 +2814,6 @@ rest_of_compilation (decl) timevar_push (TV_GCSE); open_dump_file (DFI_gcse, decl); - cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); tem = gcse_main (insns, rtl_dump_file); rebuild_jump_labels (insns); delete_trivially_dead_insns (insns, max_reg_num ()); |