diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-10-12 14:14:22 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2015-10-12 14:14:22 +0000 |
commit | 56102c7f975bf2442c7e456ba58869aa8cbd40c7 (patch) | |
tree | 0cc3cd839b8e9ae49d687a44281446ca7bf4e2ad /gcc | |
parent | 7aab672f4239ec94b577d1377b2cd0ac8655df35 (diff) | |
download | gcc-56102c7f975bf2442c7e456ba58869aa8cbd40c7.zip gcc-56102c7f975bf2442c7e456ba58869aa8cbd40c7.tar.gz gcc-56102c7f975bf2442c7e456ba58869aa8cbd40c7.tar.bz2 |
Add missing phis in expand_omp_for_generic
2015-10-12 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/67476
* omp-low.c (expand_omp_for_generic): Add missing phis.
From-SVN: r228718
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/omp-low.c | 38 |
2 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 97f4a0d..c34e084 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,11 @@ 2015-10-12 Tom de Vries <tom@codesourcery.com> PR tree-optimization/67476 + * omp-low.c (expand_omp_for_generic): Add missing phis. + +2015-10-12 Tom de Vries <tom@codesourcery.com> + + PR tree-optimization/67476 * omp-low.c (expand_omp_for_generic): Handle simple latch. 2015-10-12 Christophe Lyon <christophe.lyon@linaro.org> diff --git a/gcc/omp-low.c b/gcc/omp-low.c index f59a6a4..b2a93b9 100644 --- a/gcc/omp-low.c +++ b/gcc/omp-low.c @@ -238,6 +238,7 @@ static vec<omp_context *> 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, |