Hi,

This is (hopefully) a permanent fix  to pr46886.c
I removed the condition preventing parallelization of do_while loops, as 
it 
was blocking parallelizing important loops in spec-2006.
The patch fixes the number of iterations for cases where the body could 
appear in the latch, as in pr46886.c.

2012-03-26  Razya Ladelsky  <ra...@il.ibm.com>

                 PR tree-optimization/46886
                 * tree-parloops.c (transform_to_exit_first_loop):Set 
number of iterations correctly when the body may appear at the latch.
                 (pallelize_loops): Remove the condition preventing 
do-while loops.
 


Bootstrap and testsuite psss successfully on power7 linux machine.
Ok to commit?
Thanks,



Index: tree-parloops.c
===================================================================
--- tree-parloops.c     (revision 185775)
+++ tree-parloops.c     (working copy)
@@ -1522,7 +1522,10 @@ transform_to_exit_first_loop (struct loop *loop, h
     the condition, moving the condition to the entry requires
     decrementing one iteration.  */
   exit_1 = EDGE_SUCC (exit->src, EDGE_SUCC (exit->src, 0) == exit); 
-  if (exit_1->dest == loop->latch)
+  
+  /* if the latch contains more than the one statemnt of control variable 
+     increment then it contains the body.  */
+  if (exit_1->dest == loop->latch && last_and_only_stmt (loop->latch))
     new_rhs = gimple_cond_rhs (cond_stmt);
   else
   {
@@ -2146,7 +2149,6 @@ parallelize_loops (void)
     return false;
   if (cfun->has_nonlocal_label)
     return false;
-
   gcc_obstack_init (&parloop_obstack);
   reduction_list = htab_create (10, reduction_info_hash,
                                     reduction_info_eq, free);
@@ -2187,10 +2189,7 @@ parallelize_loops (void)
          || loop_has_blocks_with_irreducible_flag (loop)
          || (loop_preheader_edge (loop)->src->flags & BB_IRREDUCIBLE_LOOP)
          /* FIXME: the check for vector phi nodes could be removed.  */
-         || loop_has_vector_phi_nodes (loop)
-         /* FIXME: transform_to_exit_first_loop does not handle not
-            header-copied loops correctly - see PR46886.  */
-         || !do_while_loop_p (loop))
+         || loop_has_vector_phi_nodes (loop))
        continue;
       estimated = max_stmt_executions_int (loop, false);
       /* FIXME: Bypass this check as graphite doesn't update the
@@ -2213,6 +2212,7 @@ parallelize_loops (void)
        continue;
 
       changed = true;
+       
       if (dump_file && (dump_flags & TDF_DETAILS))
       {
        if (loop->inner)
=

Reply via email to