aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom de Vries <tom@codesourcery.com>2015-10-12 14:14:22 +0000
committerTom de Vries <tom@codesourcery.com>2015-10-12 14:14:22 +0000
commit2c12c136bf29eee196b840c65a550a009c44a0c4 (patch)
tree0cc3cd839b8e9ae49d687a44281446ca7bf4e2ad
parent6c4bd64fc015a1e7bb0a1b8e4a05476704c1eda1 (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/ChangeLog5
-rw-r--r--gcc/omp-low.c38
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,