gcse.c (delete_null_pointer_checks_1): Add delete_list argument, push insns to delete...
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Apr 2001 20:19:23 +0000 (22:19 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 4 Apr 2001 20:19:23 +0000 (22:19 +0200)
* 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

gcc/ChangeLog
gcc/gcse.c

index c4656938ea1a2c9a33fbd4e10cb31db8219703ad..452d6f56578614c9abe9f8ecff9d0fff0b3b627d 100644 (file)
@@ -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.
index 9eda522e859e07d68de6f077f033112ac6eb9ce9..f060a8e8875cb0b27fed35d4fca8eda115cb3072 100644 (file)
@@ -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);