diff options
author | Tom de Vries <tom@codesourcery.com> | 2015-10-12 14:14:22 +0000 |
---|---|---|
committer | Tom de Vries <tom@codesourcery.com> | 2015-10-12 14:14:22 +0000 |
commit | 2c12c136bf29eee196b840c65a550a009c44a0c4 (patch) | |
tree | 0cc3cd839b8e9ae49d687a44281446ca7bf4e2ad | |
parent | 6c4bd64fc015a1e7bb0a1b8e4a05476704c1eda1 (diff) |
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.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@228718 138bc75d-0d04-0410-961f-82ee72b054a4
-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 97f4a0d7b2d..c34e0840c58 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 f59a6a436f0..b2a93b99c7e 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, |