OSDN Git Service

2006-09-05 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / tree-ssa-loop-unswitch.c
index d4ab192..d9102b2 100644 (file)
@@ -1,5 +1,5 @@
 /* Loop unswitching.
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
    
 This file is part of GCC.
    
@@ -15,8 +15,8 @@ for more details.
    
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301, USA.  */
 
 #include "config.h"
 #include "system.h"
@@ -80,7 +80,7 @@ static tree tree_may_unswitch_on (basic_block, struct loop *);
 
 /* Main entry point.  Perform loop unswitching on all suitable LOOPS.  */
 
-void
+unsigned int
 tree_ssa_unswitch_loops (struct loops *loops)
 {
   int i, num;
@@ -101,17 +101,11 @@ tree_ssa_unswitch_loops (struct loops *loops)
        continue;
 
       changed |= tree_unswitch_single_loop (loops, loop, 0);
-#ifdef ENABLE_CHECKING
-      verify_dominators (CDI_DOMINATORS);
-      verify_loop_structure (loops);
-#endif
     }
 
-#if 0
-  /* The necessary infrastructure is not in yet.  */
   if (changed)
-    cleanup_tree_cfg_loop ();
-#endif
+    return TODO_cleanup_cfg;
+  return 0;
 }
 
 /* Checks whether we can unswitch LOOP on condition at end of BB -- one of its
@@ -120,10 +114,9 @@ tree_ssa_unswitch_loops (struct loops *loops)
 static tree
 tree_may_unswitch_on (basic_block bb, struct loop *loop)
 {
-  tree stmt, def, cond;
+  tree stmt, def, cond, use;
   basic_block def_bb;
-  use_optype uses;
-  unsigned i;
+  ssa_op_iter iter;
 
   /* BB must end in a simple conditional jump.  */
   stmt = last_stmt (bb);
@@ -131,11 +124,9 @@ tree_may_unswitch_on (basic_block bb, struct loop *loop)
     return NULL_TREE;
 
   /* Condition must be invariant.  */
-  get_stmt_operands (stmt);
-  uses = STMT_USE_OPS (stmt);
-  for (i = 0; i < NUM_USES (uses); i++)
+  FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
     {
-      def = SSA_NAME_DEF_STMT (USE_OP (uses, i));
+      def = SSA_NAME_DEF_STMT (use);
       def_bb = bb_for_stmt (def);
       if (def_bb
          && flow_bb_inside_loop_p (loop, def_bb))
@@ -172,10 +163,10 @@ simplify_using_entry_checks (struct loop *loop, tree cond)
                ? boolean_true_node
                : boolean_false_node);
 
-      if (EDGE_COUNT (e->src->preds) > 1)
+      if (!single_pred_p (e->src))
        return cond;
 
-      e = EDGE_PRED (e->src, 0);
+      e = single_pred_edge (e->src);
       if (e->src == ENTRY_BLOCK_PTR)
        return cond;
     }
@@ -252,21 +243,31 @@ tree_unswitch_single_loop (struct loops *loops, struct loop *loop, int num)
       else
        break;
 
-      modify_stmt (stmt);
+      update_stmt (stmt);
       i++;
     }
 
   if (dump_file && (dump_flags & TDF_DETAILS))
     fprintf (dump_file, ";; Unswitching loop\n");
 
+  initialize_original_copy_tables ();
   /* Unswitch the loop on this condition.  */
   nloop = tree_unswitch_loop (loops, loop, bbs[i], cond);
   if (!nloop)
-    return changed;
+    {
+      free_original_copy_tables ();
+      free (bbs);
+      return changed;
+    }
+
+  /* Update the SSA form after unswitching.  */
+  update_ssa (TODO_update_ssa);
+  free_original_copy_tables ();
 
   /* Invoke itself on modified loops.  */
   tree_unswitch_single_loop (loops, nloop, num + 1);
   tree_unswitch_single_loop (loops, loop, num + 1);
+  free (bbs);
   return true;
 }
 
@@ -286,6 +287,6 @@ tree_unswitch_loop (struct loops *loops, struct loop *loop,
   gcc_assert (EDGE_COUNT (unswitch_on->succs) == 2);
   gcc_assert (loop->inner == NULL);
 
-  return tree_ssa_loop_version (loops, loop, unshare_expr (cond), 
-                               &condition_bb);
+  return loop_version (loops, loop, unshare_expr (cond), 
+                      &condition_bb, false);
 }