X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fgraphite-scop-detection.c;h=36a521578cb779afd36430fbb16cb3e2f7437df3;hb=2abf995f90bb8441b573eba4ea14c0b8e0c1bba9;hp=ddd1121a58da4bbce8ea66cdbc829e34d165b173;hpb=ce363cd500e2c756a835dc09c840e6d754222ef1;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index ddd1121a58d..36a521578cb 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1,5 +1,5 @@ /* Detection of Static Control Parts (SCoP) for Graphite. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. Contributed by Sebastian Pop and Tobias Grosser . @@ -225,6 +225,7 @@ graphite_can_represent_scev (tree scev, int outermost_loop) && !CONVERT_EXPR_CODE_P (TREE_CODE (TREE_OPERAND (scev, 1))) && !(chrec_contains_symbols (TREE_OPERAND (scev, 0)) && chrec_contains_symbols (TREE_OPERAND (scev, 1))) + && graphite_can_represent_init (scev) && graphite_can_represent_scev (TREE_OPERAND (scev, 0), outermost_loop) && graphite_can_represent_scev (TREE_OPERAND (scev, 1), outermost_loop); @@ -934,9 +935,6 @@ create_single_exit_edge (sd_region *region) edge forwarder = NULL; basic_block exit; - if (find_single_exit_edge (region)) - return; - /* We create a forwarder bb (5) for all edges leaving this region (3->5, 4->5). All other edges leading to the same bb, are moved to a new bb (6). If these edges where part of another region (2->5) @@ -1030,7 +1028,10 @@ create_sese_edges (VEC (sd_region, heap) *regions) mark_exit_edges (regions); for (i = 0; VEC_iterate (sd_region, regions, i, s); i++) - create_single_exit_edge (s); + /* Don't handle multiple edges exiting the function. */ + if (!find_single_exit_edge (s) + && s->exit != EXIT_BLOCK_PTR) + create_single_exit_edge (s); unmark_exit_edges (regions); @@ -1056,7 +1057,12 @@ build_graphite_scops (VEC (sd_region, heap) *regions, { edge entry = find_single_entry_edge (s); edge exit = find_single_exit_edge (s); - scop_p scop = new_scop (new_sese (entry, exit)); + scop_p scop; + + if (!exit) + continue; + + scop = new_scop (new_sese (entry, exit)); VEC_safe_push (scop_p, heap, *scops, scop); /* Are there overlapping SCoPs? */ @@ -1297,7 +1303,7 @@ canonicalize_loop_closed_ssa_form (void) loop_p loop; #ifdef ENABLE_CHECKING - verify_loop_closed_ssa (); + verify_loop_closed_ssa (true); #endif FOR_EACH_LOOP (li, loop, 0) @@ -1307,7 +1313,7 @@ canonicalize_loop_closed_ssa_form (void) update_ssa (TODO_update_ssa); #ifdef ENABLE_CHECKING - verify_loop_closed_ssa (); + verify_loop_closed_ssa (true); #endif } @@ -1322,7 +1328,7 @@ build_scops (VEC (scop_p, heap) **scops) canonicalize_loop_closed_ssa_form (); build_scops_1 (single_succ (ENTRY_BLOCK_PTR), ENTRY_BLOCK_PTR->loop_father, - ®ions, loop); + ®ions, loop); create_sese_edges (regions); build_graphite_scops (regions, scops);