X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-ssa-loop-unswitch.c;h=d9102b284b6739834c77dc44d9b8e2f683b3f965;hb=faa56cf9fb2c67f8b284c4d9fcdc641a7728a4a9;hp=45b7e87a229f05cdd10ab825172b5048c48f333c;hpb=e12d05910eaffcc746f6f3be59df3ca511179037;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index 45b7e87a229..d9102b284b6 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -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)) @@ -154,7 +145,7 @@ tree_may_unswitch_on (basic_block bb, struct loop *loop) /* Simplifies COND using checks in front of the entry of the LOOP. Just very simplish (sufficient to prevent us from duplicating loop in unswitching - unneccesarily). */ + unnecessarily). */ static tree simplify_using_entry_checks (struct loop *loop, tree cond) @@ -172,10 +163,10 @@ simplify_using_entry_checks (struct loop *loop, tree cond) ? boolean_true_node : boolean_false_node); - if (e->src->pred->pred_next) + if (!single_pred_p (e->src)) return cond; - e = e->src->pred; + 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; } @@ -283,11 +284,9 @@ tree_unswitch_loop (struct loops *loops, struct loop *loop, /* Some sanity checking. */ gcc_assert (flow_bb_inside_loop_p (loop, unswitch_on)); - gcc_assert (unswitch_on->succ != NULL); - gcc_assert (unswitch_on->succ->succ_next != NULL); - gcc_assert (unswitch_on->succ->succ_next->succ_next == NULL); + 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); }