aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-cfg.c
diff options
context:
space:
mode:
authorRazya Ladelsky <razya@il.ibm.com>2012-04-22 10:36:13 +0000
committerRazya Ladelsky <razya@gcc.gnu.org>2012-04-22 10:36:13 +0000
commit69958396d92cc0b3948572e8b2348c30ef22e0a5 (patch)
treecebf71b4ea7eba71b04a1cce8154ce8b65a383b1 /gcc/tree-cfg.c
parentbf310e122b95cc6c849afe81fae5ef93a2722556 (diff)
downloadgcc-69958396d92cc0b3948572e8b2348c30ef22e0a5.zip
gcc-69958396d92cc0b3948572e8b2348c30ef22e0a5.tar.gz
gcc-69958396d92cc0b3948572e8b2348c30ef22e0a5.tar.bz2
Correcting transform_to_exit_first_loop + fix to PR tree-optimization/46886
2012-04-20 Razya Ladelsky <razya@il.ibm.com> Correcting transform_to_exit_first_loop + fix to PR tree-optimization/46886 * tree-parloops.c (transform_to_exit_first_loop): * Remove setting of number of iterations according to * the loop pattern. Duplicate from entry to exit->src instead of loop->latch. (pallelize_loops): Remove the condition preventing do-while loops. * tree-cfg.c (bool bb_in_region_p): New. (gimple_duplicate_sese_tail): Adjust duplication of the the subloops. Adjust redirection of the duplicated iteration. From-SVN: r186667
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r--gcc/tree-cfg.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index 7245566..e32daa7 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -5595,6 +5595,20 @@ gimple_duplicate_sese_region (edge entry, edge exit,
return true;
}
+/* Checks if BB is part of the region defined by N_REGION BBS. */
+static bool
+bb_part_of_region_p (basic_block bb, basic_block* bbs, unsigned n_region)
+{
+ unsigned int n;
+
+ for (n = 0; n < n_region; n++)
+ {
+ if (bb == bbs[n])
+ return true;
+ }
+ return false;
+}
+
/* Duplicates REGION consisting of N_REGION blocks. The new blocks
are stored to REGION_COPY in the same order in that they appear
in REGION, if REGION_COPY is not NULL. ENTRY is the entry to
@@ -5645,6 +5659,7 @@ gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNU
gimple_stmt_iterator psi;
gimple phi;
tree def;
+ struct loop *target, *aloop, *cloop;
gcc_assert (EDGE_COUNT (exit->src->succs) == 2);
exits[0] = exit;
@@ -5655,7 +5670,16 @@ gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNU
initialize_original_copy_tables ();
set_loop_copy (orig_loop, loop);
- duplicate_subloops (orig_loop, loop);
+
+ target= loop;
+ for (aloop = orig_loop->inner; aloop; aloop = aloop->next)
+ {
+ if (bb_part_of_region_p (aloop->header, region, n_region))
+ {
+ cloop = duplicate_loop (aloop, target);
+ duplicate_subloops (aloop, cloop);
+ }
+ }
if (!region_copy)
{
@@ -5758,7 +5782,7 @@ gimple_duplicate_sese_tail (edge entry ATTRIBUTE_UNUSED, edge exit ATTRIBUTE_UNU
add_phi_arg (phi, def, e, gimple_phi_arg_location_from_edge (phi, e));
}
}
- e = redirect_edge_and_branch (nexits[0], nexits[1]->dest);
+ e = redirect_edge_and_branch (nexits[1], nexits[0]->dest);
PENDING_STMT (e) = NULL;
/* Anything that is outside of the region, but was dominated by something