diff options
author | Jeff Law <law@redhat.com> | 2002-06-14 10:25:36 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2002-06-14 10:25:36 -0600 |
commit | 99a15921f00b8d3956a66a39bc98c57893a665f0 (patch) | |
tree | 72e1faa1b66f9c943d6e2c2fa17de7b0761bbfca /gcc/gcse.c | |
parent | e56c446321eafc7f19e1d7cd0ef0fa2bdfe40b5f (diff) | |
download | gcc-99a15921f00b8d3956a66a39bc98c57893a665f0.zip gcc-99a15921f00b8d3956a66a39bc98c57893a665f0.tar.gz gcc-99a15921f00b8d3956a66a39bc98c57893a665f0.tar.bz2 |
gcse.c (delete_null_pointer_checks_1): Inform caller if any null pointer checks were eliminated.
* 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..
From-SVN: r54617
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r-- | gcc/gcse.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -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. */ |