aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-04-04 22:19:23 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2001-04-04 22:19:23 +0200
commit8e184d9cc12b898bba2aebea0e0e8d5faac9e569 (patch)
tree7aef91698117ee2beec54a5b9d64e2c363eded79
parent75da53c9eee2bab8452bfec70dc0cddc5e391b2b (diff)
downloadgcc-8e184d9cc12b898bba2aebea0e0e8d5faac9e569.zip
gcc-8e184d9cc12b898bba2aebea0e0e8d5faac9e569.tar.gz
gcc-8e184d9cc12b898bba2aebea0e0e8d5faac9e569.tar.bz2
gcse.c (delete_null_pointer_checks_1): Add delete_list argument, push insns to delete to it instead of deleting them.
* 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. From-SVN: r41092
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/gcse.c27
2 files changed, 28 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c465693..452d6f5 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 9eda522..f060a8e 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);