X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Ftree-loop-linear.c;h=61fdee3f0681f79a049b9c5825b18e726207efd3;hb=0305c755745c1d24fb688d9b5bb540c4232417b7;hp=a47981c94d02cc932848d4727d58ed1e4f0a3a2c;hpb=41c7a32495cd3504d8df84dda26c4c5d1de25185;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c index a47981c94d0..61fdee3f068 100644 --- a/gcc/tree-loop-linear.c +++ b/gcc/tree-loop-linear.c @@ -178,6 +178,9 @@ try_interchange_loops (lambda_trans_matrix trans, unsigned int nb_deps_not_carried_by_i, nb_deps_not_carried_by_j; struct data_dependence_relation *ddr; + if (VEC_length (ddr_p, dependence_relations) == 0) + return trans; + /* When there is an unknown relation in the dependence_relations, we know that it is no worth looking at this loop nest: give up. */ ddr = VEC_index (ddr_p, dependence_relations, 0); @@ -233,26 +236,26 @@ try_interchange_loops (lambda_trans_matrix trans, return trans; } -/* Perform a set of linear transforms on LOOPS. */ +/* Perform a set of linear transforms on loops. */ void -linear_transform_loops (struct loops *loops) +linear_transform_loops (void) { - unsigned int i; + bool modified = false; + loop_iterator li; VEC(tree,heap) *oldivs = NULL; VEC(tree,heap) *invariants = NULL; + struct loop *loop_nest; - for (i = 1; i < loops->num; i++) + FOR_EACH_LOOP (li, loop_nest, 0) { unsigned int depth = 0; VEC (ddr_p, heap) *dependence_relations; VEC (data_reference_p, heap) *datarefs; - struct loop *loop_nest = loops->parray[i]; struct loop *temp; lambda_loopnest before, after; lambda_trans_matrix trans; bool problem = false; - bool need_perfect_nest = false; /* If it's not a loop nest, we don't want it. We also don't handle sibling loops properly, which are loops of the following form: @@ -262,12 +265,12 @@ linear_transform_loops (struct loops *loops) { ... } - for (j = 0; j < 50; j++) + for (j = 0; j < 50; j++) { ... } } */ - if (!loop_nest || !loop_nest->inner) + if (!loop_nest->inner || !single_exit (loop_nest)) continue; VEC_truncate (tree, oldivs, 0); VEC_truncate (tree, invariants, 0); @@ -275,7 +278,7 @@ linear_transform_loops (struct loops *loops) for (temp = loop_nest->inner; temp; temp = temp->inner) { /* If we have a sibling loop or multiple exit edges, jump ship. */ - if (temp->next || !temp->single_exit) + if (temp->next || !single_exit (temp)) { problem = true; break; @@ -289,8 +292,8 @@ linear_transform_loops (struct loops *loops) datarefs = VEC_alloc (data_reference_p, heap, 10); dependence_relations = VEC_alloc (ddr_p, heap, 10 * 10); - compute_data_dependences_for_loop (loop_nest, true, datarefs, - dependence_relations); + compute_data_dependences_for_loop (loop_nest, true, &datarefs, + &dependence_relations); if (dump_file && (dump_flags & TDF_DETAILS)) dump_ddrs (dump_file, dependence_relations); @@ -305,7 +308,7 @@ linear_transform_loops (struct loops *loops) { if (dump_file) fprintf (dump_file, "Won't transform loop. Optimal transform is the identity transform\n"); - continue; + goto free_and_continue; } /* Check whether the transformation is legal. */ @@ -313,19 +316,15 @@ linear_transform_loops (struct loops *loops) { if (dump_file) fprintf (dump_file, "Can't transform loop, transform is illegal:\n"); - continue; + goto free_and_continue; } - if (!perfect_nest_p (loop_nest)) - need_perfect_nest = true; + before = gcc_loopnest_to_lambda_loopnest (loop_nest, &oldivs, + &invariants); - before = gcc_loopnest_to_lambda_loopnest (loops, - loop_nest, &oldivs, - &invariants, - need_perfect_nest); if (!before) - continue; - + goto free_and_continue; + if (dump_file) { fprintf (dump_file, "Before:\n"); @@ -342,10 +341,12 @@ linear_transform_loops (struct loops *loops) lambda_loopnest_to_gcc_loopnest (loop_nest, oldivs, invariants, after, trans); + modified = true; if (dump_file) fprintf (dump_file, "Successfully transformed loop.\n"); + free_and_continue: free_dependence_relations (dependence_relations); free_data_refs (datarefs); } @@ -353,5 +354,7 @@ linear_transform_loops (struct loops *loops) VEC_free (tree, heap, oldivs); VEC_free (tree, heap, invariants); scev_reset (); - rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa_full_phi); + + if (modified) + rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa_full_phi); }