Handle exit phi without header phi in create_parallel_loop
authorTom de Vries <tom@codesourcery.com>
Thu, 16 Jul 2015 11:51:38 +0000 (11:51 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 16 Jul 2015 11:51:38 +0000 (11:51 +0000)
2015-07-16  Tom de Vries  <tom@codesourcery.com>

* tree-parloops.c (create_parallel_loop): Handle case that exit phi does
not have a corresponding loop header phi.

From-SVN: r225873

gcc/ChangeLog
gcc/tree-parloops.c

index cfdf5e75747f318df23598441563d155289b41ad..764e8bc874eb0a0320607d5b8e4b4bb997a603ad 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-16  Tom de Vries  <tom@codesourcery.com>
+
+       * tree-parloops.c (create_parallel_loop): Handle case that exit phi does
+       not have a corresponding loop header phi.
+
 2015-07-16  Tom de Vries  <tom@codesourcery.com>
 
        * tree-parloops.c (create_loads_for_reductions): Handle case that
index 2390d9ec5058dfca0cacca1b86655744d3128315..ec418343c265e6a4c585c838b8abaf61eb63c5c3 100644 (file)
@@ -2050,13 +2050,17 @@ create_parallel_loop (struct loop *loop, tree loop_fn, tree data,
        !gsi_end_p (gpi); gsi_next (&gpi))
     {
       source_location locus;
-      tree def;
       gphi *phi = gpi.phi ();
-      gphi *stmt;
+      tree def = PHI_ARG_DEF_FROM_EDGE (phi, exit);
+      gimple def_stmt = SSA_NAME_DEF_STMT (def);
 
-      stmt = as_a <gphi *> (
-              SSA_NAME_DEF_STMT (PHI_ARG_DEF_FROM_EDGE (phi, exit)));
+      /* If the exit phi is not connected to a header phi in the same loop, this
+        value is not modified in the loop, and we're done with this phi.  */
+      if (!(gimple_code (def_stmt) == GIMPLE_PHI
+           && gimple_bb (def_stmt) == loop->header))
+       continue;
 
+      gphi *stmt = as_a <gphi *> (def_stmt);
       def = PHI_ARG_DEF_FROM_EDGE (stmt, loop_preheader_edge (loop));
       locus = gimple_phi_arg_location_from_edge (stmt,
                                                 loop_preheader_edge (loop));