re PR tree-optimization/83410 (libgomp.graphite/force-parallel-4.c etc. FAIL)
authorJeff Law <law@redhat.com>
Fri, 15 Dec 2017 16:19:22 +0000 (09:19 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 15 Dec 2017 16:19:22 +0000 (09:19 -0700)
PR tree-optimization/83410
* tree-ssa-threadupdate.c (thread_block_1): Avoid certain jump
threads when parallelizing loops.

From-SVN: r255700

gcc/ChangeLog
gcc/tree-ssa-threadupdate.c

index 8830638d226357ede9d1e769bbd5e9a6c9e19be6..2d53e24b4c1f7943625c03a8ec8e6d651f694125 100644 (file)
@@ -1,3 +1,9 @@
+2017-12-12  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/83410
+       * tree-ssa-threadupdate.c (thread_block_1): Avoid certain jump
+       threads when parallelizing loops.
+
 2017-12-15  Jakub Jelinek  <jakub@redhat.com>
 
        * tree-core.h (struct attribute_spec): Swap affects_type_identity and
index 045905eceb7290c3ebf25d6b621f501222eaeabf..63ad8f9c95372c81bffd1cb4746e70cc034ae718 100644 (file)
@@ -1333,6 +1333,31 @@ thread_block_1 (basic_block bb, bool noloop_only, bool joiners)
 
          if (i != path->length ())
            continue;
+
+         /* Loop parallelization can be confused by the result of
+            threading through the loop exit test back into the loop.
+            However, theading those jumps seems to help other codes.
+
+            I have been unable to find anything related to the shape of
+            the CFG, the contents of the affected blocks, etc which would
+            allow a more sensible test than what we're using below which
+            merely avoids the optimization when parallelizing loops.  */
+         if (flag_tree_parallelize_loops > 1)
+           {
+             for (i = 1; i < path->length (); i++)
+               if (bb->loop_father == e2->src->loop_father
+                   && loop_exits_from_bb_p (bb->loop_father,
+                                            (*path)[i]->e->src)
+                   && !loop_exit_edge_p (bb->loop_father, e2))
+                 break;
+
+             if (i != path->length ())
+               {
+                 delete_jump_thread_path (path);
+                 e->aux = NULL;
+                 continue;
+               }
+           }
        }
 
       /* Insert the outgoing edge into the hash table if it is not