OSDN Git Service

2005-06-14 Pascal Obry <obry@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-sink.c
index c8785de..6bd77ab 100644 (file)
@@ -23,7 +23,6 @@ Boston, MA 02111-1307, USA.  */
 #include "system.h"
 #include "coretypes.h"
 #include "tm.h"
-#include "errors.h"
 #include "ggc.h"
 #include "tree.h"
 #include "basic-block.h"
@@ -138,16 +137,10 @@ all_immediate_uses_same_place (tree stmt)
 bool
 is_hidden_global_store (tree stmt)
 {
-  stmt_ann_t ann = stmt_ann (stmt);
-  v_may_def_optype v_may_defs;
-  v_must_def_optype v_must_defs;
-    
   /* Check virtual definitions.  If we get here, the only virtual
      definitions we should see are those generated by assignment
      statements.  */
-  v_may_defs = V_MAY_DEF_OPS (ann);
-  v_must_defs = V_MUST_DEF_OPS (ann);
-  if (NUM_V_MAY_DEFS (v_may_defs) > 0 || NUM_V_MUST_DEFS (v_must_defs) > 0)
+  if (!ZERO_SSA_OPERANDS (stmt, SSA_OP_VIRTUAL_DEFS))
     {
       tree lhs;
 
@@ -238,33 +231,25 @@ nearest_common_dominator_of_uses (tree stmt)
         {
          tree usestmt = USE_STMT (use_p);
          basic_block useblock;
+
          if (TREE_CODE (usestmt) == PHI_NODE)
            {
-             int j;
-             for (j = 0; j < PHI_NUM_ARGS (usestmt); j++)
-               {
-                 useblock = PHI_ARG_EDGE (usestmt, j)->src;
-                 /* Short circuit. Nothing dominates the entry block.  */
-                 if (useblock == ENTRY_BLOCK_PTR)
-                   {
-                     BITMAP_FREE (blocks);
-                     return NULL;
-                   }
-                 bitmap_set_bit (blocks, useblock->index);
-               }
+             int idx = PHI_ARG_INDEX_FROM_USE (use_p);
+
+             useblock = PHI_ARG_EDGE (usestmt, idx)->src;
            }
          else
            {
              useblock = bb_for_stmt (usestmt);
+           }
 
-             /* Short circuit. Nothing dominates the entry block.  */
-             if (useblock == ENTRY_BLOCK_PTR)
-               {
-                 BITMAP_FREE (blocks);
-                 return NULL;
-               }
-             bitmap_set_bit (blocks, useblock->index);
+         /* Short circuit. Nothing dominates the entry block.  */
+         if (useblock == ENTRY_BLOCK_PTR)
+           {
+             BITMAP_FREE (blocks);
+             return NULL;
            }
+         bitmap_set_bit (blocks, useblock->index);
        }
     }
   commondom = BASIC_BLOCK (bitmap_first_set_bit (blocks));
@@ -332,13 +317,13 @@ statement_sink_location (tree stmt, basic_block frombb)
 
   */
   ann = stmt_ann (stmt);
-  if (NUM_VUSES (STMT_VUSE_OPS (stmt)) != 0
-      || stmt_ends_bb_p (stmt)
+  if (stmt_ends_bb_p (stmt)
       || TREE_SIDE_EFFECTS (rhs)
       || TREE_CODE (rhs) == EXC_PTR_EXPR
       || TREE_CODE (rhs) == FILTER_EXPR
       || is_hidden_global_store (stmt)
-      || ann->has_volatile_ops)
+      || ann->has_volatile_ops
+      || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VUSE))
     return NULL;
   
   FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
@@ -405,18 +390,10 @@ statement_sink_location (tree stmt, basic_block frombb)
     }
 
   /* Note that at this point, all uses must be in the same statement, so it
-     doesn't matter which def op we choose.  */
-  if (STMT_DEF_OPS (stmt) == NULL)
-    {
-      if (STMT_V_MAY_DEF_OPS (stmt) != NULL)
-       def = V_MAY_DEF_RESULT (STMT_V_MAY_DEF_OPS (stmt), 0);
-      else if (STMT_V_MUST_DEF_OPS (stmt) != NULL)
-       def = V_MUST_DEF_RESULT (STMT_V_MUST_DEF_OPS (stmt), 0);
-      else
-       gcc_unreachable ();
-    }
-  else
-    def = DEF_OP (STMT_DEF_OPS (stmt), 0);
+     doesn't matter which def op we choose, pick the first one.  */
+  FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
+    break;
+
   
   sinkbb = find_bb_for_arg (use, def);
   if (!sinkbb)
@@ -464,7 +441,6 @@ sink_code_in_bb (basic_block bb)
       tree stmt = bsi_stmt (bsi);      
       block_stmt_iterator tobsi;
       tree sinkstmt;
-      get_stmt_operands (stmt);
       
       sinkstmt = statement_sink_location (stmt, bb);
       if (!sinkstmt)
@@ -586,6 +562,9 @@ struct tree_opt_pass pass_sink_code =
   0,                                   /* properties_provided */
   0,                                   /* properties_destroyed */
   0,                                   /* todo_flags_start */
-  TODO_rename_vars | TODO_dump_func | TODO_ggc_collect | TODO_verify_ssa, /* todo_flags_finish */
+  TODO_update_ssa 
+    | TODO_dump_func
+    | TODO_ggc_collect
+    | TODO_verify_ssa,                 /* todo_flags_finish */
   0                                    /* letter */
 };