Fix inner loop phi in expand_omp_for_static_chunk
authorTom de Vries <tom@codesourcery.com>
Thu, 3 Sep 2015 11:01:14 +0000 (11:01 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 3 Sep 2015 11:01:14 +0000 (11:01 +0000)
2015-09-03  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/65637
* omp-low.c (find_phi_with_arg_on_edge): New function.
(expand_omp_for_static_chunk): Fix inner loop phi.

* testsuite/libgomp.c/autopar-2.c: New test.

From-SVN: r227437

gcc/ChangeLog
gcc/omp-low.c
libgomp/ChangeLog
libgomp/testsuite/libgomp.c/autopar-2.c [new file with mode: 0644]

index ae76185f51c2d6469844ebdb04a55fa8de703dce..f09f24f6e95cbe8c7c13f17d5278113d175994de 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-03  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/65637
+       * omp-low.c (find_phi_with_arg_on_edge): New function.
+       (expand_omp_for_static_chunk): Fix inner loop phi.
+
 2015-09-03  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/65637
index 0995652c6d3f5e004df4e70a767fb255db4a6f52..22e55f6c3cf35eb544d91b7865428df833a0b686 100644 (file)
@@ -6885,6 +6885,24 @@ expand_omp_for_static_nochunk (struct omp_region *region,
     }
 }
 
+/* Return phi in E->DEST with ARG on edge E.  */
+
+static gphi *
+find_phi_with_arg_on_edge (tree arg, edge e)
+{
+  basic_block bb = e->dest;
+
+  for (gphi_iterator gpi = gsi_start_phis (bb);
+       !gsi_end_p (gpi);
+       gsi_next (&gpi))
+    {
+      gphi *phi = gpi.phi ();
+      if (PHI_ARG_DEF_FROM_EDGE (phi, e) == arg)
+       return phi;
+    }
+
+  return NULL;
+}
 
 /* A subroutine of expand_omp_for.  Generate code for a parallel
    loop with static schedule and a specified chunk size.  Given
@@ -7324,7 +7342,19 @@ expand_omp_for_static_chunk (struct omp_region *region,
            t = vextra;
          add_phi_arg (nphi, t, ene, locus);
          locus = redirect_edge_var_map_location (vm);
-         add_phi_arg (nphi, redirect_edge_var_map_def (vm), re, locus);
+         tree back_arg = redirect_edge_var_map_def (vm);
+         add_phi_arg (nphi, back_arg, re, locus);
+         edge ce = find_edge (cont_bb, body_bb);
+         if (ce == NULL)
+           {
+             ce = BRANCH_EDGE (cont_bb);
+             gcc_assert (single_succ (ce->dest) == body_bb);
+             ce = single_succ_edge (ce->dest);
+           }
+         gphi *inner_loop_phi = find_phi_with_arg_on_edge (back_arg, ce);
+         gcc_assert (inner_loop_phi != NULL);
+         add_phi_arg (inner_loop_phi, gimple_phi_result (nphi),
+                      find_edge (seq_start_bb, body_bb), locus);
        }
       gcc_assert (gsi_end_p (psi) && (head == NULL || i == head->length ()));
       redirect_edge_var_map_clear (re);
index 71e1fbaae42178ad6713d5315faed90181f80423..d5aaa486204869bd2f344c08aa0f12d86c3c399f 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-03  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/65637
+       * testsuite/libgomp.c/autopar-2.c: New test.
+
 2015-08-29  Tom de Vries  <tom@codesourcery.com>
 
        PR tree-optimization/46193
diff --git a/libgomp/testsuite/libgomp.c/autopar-2.c b/libgomp/testsuite/libgomp.c/autopar-2.c
new file mode 100644 (file)
index 0000000..821a4da
--- /dev/null
@@ -0,0 +1,4 @@
+/* { dg-do run } */
+/* { dg-additional-options "-ftree-parallelize-loops=4 -ffast-math --param parloops-chunk-size=100" } */
+
+#include "autopar-1.c"