aboutsummaryrefslogtreecommitdiff
path: root/gcc/omp-low.c
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-09-03 11:01:22 +0000
committerTom de Vries <vries@gcc.gnu.org>2015-09-03 11:01:22 +0000
commit17720e84bfd8df2224886b087cccf236e237d5bc (patch)
treecaa3b85f9bc3928fa8a2083d0af0e75b2e196e44 /gcc/omp-low.c
parent1b96e9a4bfb7d1ed3e4795288b69e0ba8b08f330 (diff)
downloadgcc-17720e84bfd8df2224886b087cccf236e237d5bc.zip
gcc-17720e84bfd8df2224886b087cccf236e237d5bc.tar.gz
gcc-17720e84bfd8df2224886b087cccf236e237d5bc.tar.bz2
Handle 2 preds for fin_bb in expand_omp_for_static_chunk
2015-09-03 Tom de Vries <tom@codesourcery.com> PR tree-optimization/65637 * omp-low.c (expand_omp_for_static_chunk): Handle case that fin_bb has 2 predecessors. * gcc.dg/autopar/reduc-4.c: New test. From-SVN: r227438
Diffstat (limited to 'gcc/omp-low.c')
-rw-r--r--gcc/omp-low.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index 22e55f6..88a5149 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -7035,7 +7035,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
se->probability = REG_BR_PROB_BASE / 2000 - 1;
if (gimple_in_ssa_p (cfun))
{
- int dest_idx = find_edge (entry_bb, fin_bb)->dest_idx;
+ int dest_idx = find_edge (iter_part_bb, fin_bb)->dest_idx;
for (gphi_iterator gpi = gsi_start_phis (fin_bb);
!gsi_end_p (gpi); gsi_next (&gpi))
{
@@ -7316,7 +7316,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
/* When we redirect the edge from trip_update_bb to iter_part_bb, we
remove arguments of the phi nodes in fin_bb. We need to create
appropriate phi nodes in iter_part_bb instead. */
- se = single_pred_edge (fin_bb);
+ se = find_edge (iter_part_bb, fin_bb);
re = single_succ_edge (trip_update_bb);
vec<edge_var_map> *head = redirect_edge_var_map_vector (re);
ene = single_succ_edge (entry_bb);
@@ -7331,6 +7331,10 @@ expand_omp_for_static_chunk (struct omp_region *region,
phi = psi.phi ();
t = gimple_phi_result (phi);
gcc_assert (t == redirect_edge_var_map_result (vm));
+
+ if (!single_pred_p (fin_bb))
+ t = copy_ssa_name (t, phi);
+
nphi = create_phi_node (t, iter_part_bb);
t = PHI_ARG_DEF_FROM_EDGE (phi, se);
@@ -7355,16 +7359,20 @@ expand_omp_for_static_chunk (struct omp_region *region,
gcc_assert (inner_loop_phi != NULL);
add_phi_arg (inner_loop_phi, gimple_phi_result (nphi),
find_edge (seq_start_bb, body_bb), locus);
+
+ if (!single_pred_p (fin_bb))
+ add_phi_arg (phi, gimple_phi_result (nphi), se, locus);
}
gcc_assert (gsi_end_p (psi) && (head == NULL || i == head->length ()));
redirect_edge_var_map_clear (re);
- while (1)
- {
- psi = gsi_start_phis (fin_bb);
- if (gsi_end_p (psi))
- break;
- remove_phi_node (&psi, false);
- }
+ if (single_pred_p (fin_bb))
+ while (1)
+ {
+ psi = gsi_start_phis (fin_bb);
+ if (gsi_end_p (psi))
+ break;
+ remove_phi_node (&psi, false);
+ }
/* Make phi node for trip. */
phi = create_phi_node (trip_main, iter_part_bb);