tree-ssa-dom.c (redirect_edges_and_update_ssa_graph): Don't even bother marking bypas...
authorJeff Law <law@redhat.com>
Sat, 15 May 2004 06:21:34 +0000 (00:21 -0600)
committerJeff Law <law@gcc.gnu.org>
Sat, 15 May 2004 06:21:34 +0000 (00:21 -0600)
        * tree-ssa-dom.c (redirect_edges_and_update_ssa_graph): Don't even
        bother marking bypassed virtuals for out-of-ssa.  Instead merge
        bypassed virtuals into vars_to_rename just before into-ssa pass.

From-SVN: r81872

gcc/ChangeLog
gcc/tree-ssa-dom.c

index 2e9f6b90f9c6b18bfe723fba1c1b7310f5ca6935..0365e82ade30c390d614263b0d34c15f461d8a96 100644 (file)
 
 2004-05-14  Jeff Law  <law@redhat.com>
 
+       * tree-ssa-dom.c (redirect_edges_and_update_ssa_graph): Don't even
+       bother marking bypassed virtuals for out-of-ssa.  Instead merge
+        bypassed virtuals into vars_to_rename just before into-ssa pass.
+
        * tree-ssa-dom.c (simplify_rhs_and_lookup_avail_expr): Reorganize
        so that it picks up more opportunities to eliminate ABS expressions
        or turn them into negations.
index 89f4c6a5cb08c22a339aa973e43faea056284999..5f8896f70196875c3350e92de970cd3eea1b86c7 100644 (file)
@@ -312,12 +312,14 @@ set_value_for (tree var, tree value, varray_type table)
 static void
 redirect_edges_and_update_ssa_graph (varray_type redirection_edges)
 {
-  basic_block tgt;
+  basic_block tgt, bb;
+  tree phi;
   unsigned int i;
   size_t old_num_referenced_vars = num_referenced_vars;
+  bitmap virtuals_to_rename = BITMAP_XMALLOC ();
 
   /* First note any variables which we are going to have to take
-     out of SSA form.  */
+     out of SSA form as well as any virtuals which need updating.  */
   for (i = 0; i < VARRAY_ACTIVE_SIZE (redirection_edges); i += 2)
     {
       block_stmt_iterator bsi;
@@ -333,7 +335,11 @@ redirect_edges_and_update_ssa_graph (varray_type redirection_edges)
       for (phi = phi_nodes (e->dest); phi; phi = TREE_CHAIN (phi))
        {
          tree result = SSA_NAME_VAR (PHI_RESULT (phi));
-         bitmap_set_bit (vars_to_rename, var_ann (result)->uid);
+
+         if (is_gimple_reg (PHI_RESULT (phi)))
+           bitmap_set_bit (vars_to_rename, var_ann (result)->uid);
+         else
+           bitmap_set_bit (virtuals_to_rename, var_ann (result)->uid);
         }
 
       /* Any variables set by statements at the start of the block we
@@ -362,7 +368,7 @@ redirect_edges_and_update_ssa_graph (varray_type redirection_edges)
          for (j = 0; j < NUM_VDEFS (vdefs); j++)
            {
              tree op = VDEF_RESULT (vdefs, j);
-             bitmap_set_bit (vars_to_rename, var_ann (op)->uid);
+             bitmap_set_bit (virtuals_to_rename, var_ann (op)->uid);
            }
        }
 
@@ -371,20 +377,11 @@ redirect_edges_and_update_ssa_graph (varray_type redirection_edges)
       for (phi = phi_nodes (tgt); phi; phi = TREE_CHAIN (phi))
        {
          tree result = SSA_NAME_VAR (PHI_RESULT (phi));
-         int j;
-
-         bitmap_set_bit (vars_to_rename, var_ann (result)->uid);
 
-         for (j = 0; j < PHI_NUM_ARGS (phi); j++)
-           {
-             tree arg = PHI_ARG_DEF (phi, j);
-
-             if (TREE_CODE (arg) != SSA_NAME)
-               continue;
-
-             arg = SSA_NAME_VAR (arg);
-             bitmap_set_bit (vars_to_rename, var_ann (arg)->uid);
-           }
+         if (is_gimple_reg (PHI_RESULT (phi)))
+           bitmap_set_bit (vars_to_rename, var_ann (result)->uid);
+         else
+           bitmap_set_bit (virtuals_to_rename, var_ann (result)->uid);
         }
     }
 
@@ -497,6 +494,28 @@ redirect_edges_and_update_ssa_graph (varray_type redirection_edges)
       bitmap_set_bit (vars_to_rename, i);
       var_ann (referenced_var (i))->out_of_ssa_tag = 0;
     }
+
+  bitmap_a_or_b (vars_to_rename, vars_to_rename, virtuals_to_rename);
+
+  /* We must remove any PHIs for virtual variables that we are going to
+     re-rename.  Hopefully we'll be able to simply update these incrementally
+     soon.  */
+  FOR_EACH_BB (bb)
+    {
+      tree next;
+
+      for (phi = phi_nodes (bb); phi; phi = next)
+       {
+         tree result = PHI_RESULT (phi);
+
+         next = TREE_CHAIN (phi);
+
+         if (bitmap_bit_p (virtuals_to_rename,
+                           var_ann (SSA_NAME_VAR (result))->uid))
+           remove_phi_node (phi, NULL, bb);
+       }
+    }
+  BITMAP_XFREE (virtuals_to_rename);
 }
 
 /* Jump threading, redundancy elimination and const/copy propagation.