tree-into-ssa.c (prepare_operand_for_rename): New argument is_use.
authorJeff Law <law@redhat.com>
Wed, 19 May 2004 20:44:32 +0000 (14:44 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 19 May 2004 20:44:32 +0000 (14:44 -0600)
* tree-into-ssa.c (prepare_operand_for_rename): New argument is_use.
If the operand is for a use, then strip away the SSA_NAME, do not
strip away the SSA_NAME for a set.  Never call release_ssa_name.
(mark_def_sites): Appropriately pass additional argument to
prepare_operand_for_rename.  If a VDEF_RESULT is not an SSA_NAME,
then set the VDEF_RESULT to the VDEF_OP.
(set_def_block): Strip away any SSA_NAME to get to the real
underlying variable.

From-SVN: r82035

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

index 50337db634b935c0421b927c7670b198098ebb9f..ae3bc3b8cfa49c1dff7a561fa2cf0583f8235882 100644 (file)
@@ -5,6 +5,15 @@
 
 2004-05-19  Jeff Law <law@redhat.com>
 
+       * tree-into-ssa.c (prepare_operand_for_rename): New argument is_use.
+       If the operand is for a use, then strip away the SSA_NAME, do not
+       strip away the SSA_NAME for a set.  Never call release_ssa_name.
+       (mark_def_sites): Appropriately pass additional argument to
+       prepare_operand_for_rename.  If a VDEF_RESULT is not an SSA_NAME,
+       then set the VDEF_RESULT to the VDEF_OP.
+       (set_def_block): Strip away any SSA_NAME to get to the real
+       underlying variable.
+
        * tree-ssa-phiopt.c (value_replacement): Handle the case where
        the desired edge out of COND_BLOCK reaches OTHER_BLOCK rather than
        BB directly.
index 368ffdf82c063bf500e8939c9f4786fc9175f27a..91c73b2ec9f5ee8cb8764fb97d425938b3a48064 100644 (file)
@@ -109,7 +109,7 @@ static void mark_def_sites_initialize_block (struct dom_walk_data *walk_data,
 static void compute_global_livein (bitmap, bitmap);
 static void set_def_block (tree, basic_block);
 static void set_livein_block (tree, basic_block);
-static bool prepare_operand_for_rename (tree *op_p, size_t *uid_p);
+static bool prepare_operand_for_rename (tree *op_p, size_t *uid_p, bool);
 static void insert_phi_nodes (bitmap *);
 static void rewrite_stmt (struct dom_walk_data *, basic_block,
                          block_stmt_iterator);
@@ -232,7 +232,7 @@ mark_def_sites (struct dom_walk_data *walk_data,
     {
       tree *use_p = USE_OP_PTR (uses, i);
 
-      if (prepare_operand_for_rename (use_p, &uid)
+      if (prepare_operand_for_rename (use_p, &uid, true)
          && !TEST_BIT (kills, uid))
        set_livein_block (*use_p, bb);
     }
@@ -243,7 +243,7 @@ mark_def_sites (struct dom_walk_data *walk_data,
     {
       tree *use_p = VUSE_OP_PTR (vuses, i);
 
-      if (prepare_operand_for_rename (use_p, &uid))
+      if (prepare_operand_for_rename (use_p, &uid, true))
        set_livein_block (*use_p, bb);
     }
 
@@ -255,12 +255,12 @@ mark_def_sites (struct dom_walk_data *walk_data,
   vdefs = VDEF_OPS (ann);
   for (i = 0; i < NUM_VDEFS (vdefs); i++)
     {
-      size_t dummy;
-
-      if (prepare_operand_for_rename (VDEF_OP_PTR (vdefs, i), &uid)
-         && prepare_operand_for_rename (VDEF_RESULT_PTR (vdefs, i), &dummy))
+      if (prepare_operand_for_rename (VDEF_OP_PTR (vdefs, i), &uid, true))
        {
-         VDEF_RESULT (vdefs, i) = VDEF_OP (vdefs, i);
+         /* If we do not already have an SSA_NAME for our destination,
+            then set the destination to the source.  */
+         if (TREE_CODE (VDEF_RESULT (vdefs, i)) != SSA_NAME)
+           VDEF_RESULT (vdefs, i) = VDEF_OP (vdefs, i);
 
          set_livein_block (VDEF_OP (vdefs, i), bb);
          set_def_block (VDEF_RESULT (vdefs, i), bb);
@@ -274,7 +274,7 @@ mark_def_sites (struct dom_walk_data *walk_data,
     {
       tree *def_p = DEF_OP_PTR (defs, i);
 
-      if (prepare_operand_for_rename (def_p, &uid))
+      if (prepare_operand_for_rename (def_p, &uid, false))
        {
          set_def_block (*def_p, bb);
          SET_BIT (kills, uid);
@@ -289,8 +289,12 @@ static void
 set_def_block (tree var, basic_block bb)
 {
   struct def_blocks_d *db_p;
-  enum need_phi_state state = var_ann (var)->need_phi_state;
+  enum need_phi_state state;
+
+  if (TREE_CODE (var) == SSA_NAME)
+    var = SSA_NAME_VAR (var);
 
+  state = var_ann (var)->need_phi_state;
   db_p = get_def_blocks_for (var);
 
   /* Set the bit corresponding to the block where VAR is defined.  */
@@ -348,12 +352,19 @@ set_livein_block (tree var, basic_block bb)
 }
 
 
-/* If the operand pointed by OP_P needs to be renamed, strip away SSA_NAME
-   wrappers (if needed) and return true.  The unique ID for the operand's
-   variable will be stored in *UID_P.  */
+/* If the operand pointed to by OP_P needs to be renamed, then
+
+     1. If OP_P is used (rather than set), then strip away any SSA_NAME
+        wrapping the operand.
+
+     2. Set *UID_P to the underlying variable's uid.
+
+     3. Return true.
+
+   Otherwise return false.  */
 
 static bool
-prepare_operand_for_rename (tree *op_p, size_t *uid_p)
+prepare_operand_for_rename (tree *op_p, size_t *uid_p, bool is_use)
 {
   tree var = (TREE_CODE (*op_p) != SSA_NAME) ? *op_p : SSA_NAME_VAR (*op_p);
   *uid_p = var_ann (var)->uid;
@@ -362,15 +373,14 @@ prepare_operand_for_rename (tree *op_p, size_t *uid_p)
   if (vars_to_rename && !bitmap_bit_p (vars_to_rename, *uid_p))
     return false;
 
-  /* The variable needs to be renamed.  If it already had an
-     SSA_NAME, strip it off.  This way, the SSA rename pass
-     doesn't need to deal with existing SSA names.  */
-  if (TREE_CODE (*op_p) == SSA_NAME)
-    {
-      if (default_def (SSA_NAME_VAR (*op_p)) != *op_p)
-       release_ssa_name (*op_p);
-      *op_p = var;
-    }
+  /* The variable needs to be renamed.  If this is a use which already
+     has an SSA_NAME, then strip it off.
+
+     By not throwing away SSA_NAMEs on assignments, we avoid a lot of 
+     useless churn of SSA_NAMEs without having to overly complicate the
+     renamer.  */
+  if (TREE_CODE (*op_p) == SSA_NAME && is_use)
+    *op_p = var;
 
   return true;
 }