]> gcc.gnu.org Git - gcc.git/commitdiff
gcse.c (bypass_last_basic_block): New global variable.
authorRoger Sayle <roger@eyesopen.com>
Sat, 25 Jan 2003 21:49:52 +0000 (21:49 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sat, 25 Jan 2003 21:49:52 +0000 (21:49 +0000)
* gcse.c (bypass_last_basic_block): New global variable.
(bypass_block):  Use redirect_edge_and_branch_force to redirect
fall-through edges.  Use bypass_last_basic_block to determine
which blocks have valid PRE information.
(bypass_conditional_jumps): Initialize bypass_last_basic_block.

From-SVN: r61800

gcc/ChangeLog
gcc/gcse.c

index 9c7c804e9e5045cde53a58adfd4a4370bb087f07..b34f95717227590e3e266dc0066573dc0da862a5 100644 (file)
@@ -1,3 +1,11 @@
+2003-01-25  Roger Sayle  <roger@eyesopen.com>
+
+       * gcse.c (bypass_last_basic_block): New global variable.
+       (bypass_block):  Use redirect_edge_and_branch_force to redirect
+       fall-through edges.  Use bypass_last_basic_block to determine
+       which blocks have valid PRE information.
+       (bypass_conditional_jumps): Initialize bypass_last_basic_block.
+
 Sat Jan 25 22:31:59 CET 2003  Jan Hubicka  <jh@suse.cz>
 
        * gcse.c (local_cprop_pass): Update reg_sets table when needed.
index cf724f43d449a57342fcab5cf77b5ca19611586e..a68374de953bdbbe0a8e48a229ba00381e27407a 100644 (file)
@@ -4527,6 +4527,13 @@ one_cprop_pass (pass, cprop_jumps, bypass_jumps)
 \f
 /* Bypass conditional jumps.  */
 
+/* The value of last_basic_block at the beginning of the jump_bypass
+   pass.  The use of redirect_edge_and_branch_force may introduce new
+   basic blocks, but the data flow analysis is only valid for basic
+   block indices less than bypass_last_basic_block.  */
+
+static int bypass_last_basic_block;
+
 /* Find a set of REGNO to a constant that is available at the end of basic
    block BB.  Returns NULL if no such set is found.  Based heavily upon
    find_avail_set.  */
@@ -4597,6 +4604,13 @@ bypass_block (bb, setcc, jump)
   for (e = bb->pred; e; e = enext)
     {
       enext = e->pred_next;
+      if (e->flags & EDGE_COMPLEX)
+       continue;
+
+      /* We can't redirect edges from new basic blocks.  */
+      if (e->src->index >= bypass_last_basic_block)
+       continue;
+
       for (i = 0; i < reg_use_count; i++)
        {
          struct reg_use *reg_used = &reg_use_table[i];
@@ -4630,12 +4644,13 @@ bypass_block (bb, setcc, jump)
          else
            dest = NULL;
 
-         /* Once basic block indices are stable, we should be able
-            to use redirect_edge_and_branch_force instead.  */
          old_dest = e->dest;
-         if (dest != NULL && dest != old_dest
-             && redirect_edge_and_branch (e, dest))
-           {
+         if (dest != NULL
+             && dest != old_dest
+             && dest != EXIT_BLOCK_PTR)
+            {
+             redirect_edge_and_branch_force (e, dest);
+
              /* Copy the register setter to the redirected edge.
                 Don't copy CC0 setters, as CC0 is dead after jump.  */
              if (setcc)
@@ -4679,6 +4694,8 @@ bypass_conditional_jumps ()
   if (ENTRY_BLOCK_PTR->next_bb == EXIT_BLOCK_PTR)
     return 0;
 
+  bypass_last_basic_block = last_basic_block;
+
   changed = 0;
   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb->next_bb,
                  EXIT_BLOCK_PTR, next_bb)
This page took 0.089879 seconds and 5 git commands to generate.