From 56102c7f975bf2442c7e456ba58869aa8cbd40c7 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Mon, 12 Oct 2015 14:14:22 +0000 Subject: [PATCH] Add missing phis in expand_omp_for_generic 2015-10-12 Tom de Vries PR tree-optimization/67476 * omp-low.c (expand_omp_for_generic): Add missing phis. From-SVN: r228718 --- gcc/ChangeLog | 5 +++++ gcc/omp-low.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97f4a0d7b2d..c34e0840c58 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-10-12 Tom de Vries + + PR tree-optimization/67476 + * omp-low.c (expand_omp_for_generic): Add missing phis. + 2015-10-12 Tom de Vries PR tree-optimization/67476 diff --git a/gcc/omp-low.c b/gcc/omp-low.c index f59a6a436f0..b2a93b99c7e 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -238,6 +238,7 @@ static vec taskreg_contexts; static void scan_omp (gimple_seq *, omp_context *); static tree scan_omp_1_op (tree *, int *, void *); +static gphi *find_phi_with_arg_on_edge (tree, edge); #define WALK_SUBSTMTS \ case GIMPLE_BIND: \ @@ -6469,6 +6470,43 @@ expand_omp_for_generic (struct omp_region *region, } make_edge (l2_bb, l0_bb, EDGE_TRUE_VALUE); + if (gimple_in_ssa_p (cfun)) + { + /* Add phis to the outer loop that connect to the phis in the inner, + original loop, and move the loop entry value of the inner phi to + the loop entry value of the outer phi. */ + gphi_iterator psi; + for (psi = gsi_start_phis (l3_bb); !gsi_end_p (psi); gsi_next (&psi)) + { + source_location locus; + gphi *nphi; + gphi *exit_phi = psi.phi (); + + edge l2_to_l3 = find_edge (l2_bb, l3_bb); + tree exit_res = PHI_ARG_DEF_FROM_EDGE (exit_phi, l2_to_l3); + + basic_block latch = BRANCH_EDGE (cont_bb)->dest; + edge latch_to_l1 = find_edge (latch, l1_bb); + gphi *inner_phi + = find_phi_with_arg_on_edge (exit_res, latch_to_l1); + + tree t = gimple_phi_result (exit_phi); + tree new_res = copy_ssa_name (t, NULL); + nphi = create_phi_node (new_res, l0_bb); + + edge l0_to_l1 = find_edge (l0_bb, l1_bb); + t = PHI_ARG_DEF_FROM_EDGE (inner_phi, l0_to_l1); + locus = gimple_phi_arg_location_from_edge (inner_phi, l0_to_l1); + edge entry_to_l0 = find_edge (entry_bb, l0_bb); + add_phi_arg (nphi, t, entry_to_l0, locus); + + edge l2_to_l0 = find_edge (l2_bb, l0_bb); + add_phi_arg (nphi, exit_res, l2_to_l0, UNKNOWN_LOCATION); + + add_phi_arg (inner_phi, new_res, l0_to_l1, UNKNOWN_LOCATION); + }; + } + set_immediate_dominator (CDI_DOMINATORS, l2_bb, recompute_dominator (CDI_DOMINATORS, l2_bb)); set_immediate_dominator (CDI_DOMINATORS, l3_bb, -- 2.30.2