summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-14 16:25:36 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-14 16:25:36 +0000
commite90391905accdac73e5f34da1ea4a7d97ce179d1 (patch)
tree72e1faa1b66f9c943d6e2c2fa17de7b0761bbfca
parentfa21d1286ce759993833f865b5307aa55d2fd49d (diff)
downloadppe42-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/ChangeLog9
-rw-r--r--gcc/gcse.c23
-rw-r--r--gcc/rtl.h2
-rw-r--r--gcc/toplev.c11
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 ());
OpenPOWER on IntegriCloud