aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Bocharnikov <dmitry.b@samsung.com>2013-10-29 12:01:59 +0000
committerDmitry Bocharnikov <dmitry.b@samsung.com>2013-10-29 12:01:59 +0000
commita0c478aaf008a778a461f1b7e1cf33ac3dbd3fec (patch)
treed4e5a437ad64446f267dfad90be57d864f78e7ea
parenta3fd465e2d4d44db5defb3f6c83633993cbe3ee5 (diff)
Fix padding blocks generation in kernels splitting.
* gcc/oacc-low.c(extract_kernels): Fix padding blocks generation. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/openacc-1_0-branch@204154 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog.ACC5
-rw-r--r--gcc/oacc-low.c66
2 files changed, 58 insertions, 13 deletions
diff --git a/ChangeLog.ACC b/ChangeLog.ACC
index 0c8ec8293bb..8f64d0b733b 100644
--- a/ChangeLog.ACC
+++ b/ChangeLog.ACC
@@ -1,3 +1,8 @@
+29-10-2013 Dmitry Bocharnikov <dmitry.b@samsung.com>
+ Fix padding blocks generation in kernels splitting.
+
+ * gcc/oacc-low.c(extract_kernels): Fix padding blocks generation.
+
29-10-2013 Ilmir Usmanov <i.usmanov@samsung.com>
Add generation of code for IF clause
diff --git a/gcc/oacc-low.c b/gcc/oacc-low.c
index a1f36d13f07..5e022f56d99 100644
--- a/gcc/oacc-low.c
+++ b/gcc/oacc-low.c
@@ -1795,36 +1795,74 @@ extract_kernels(struct loops* loops, tree child_fn,
kernels->safe_push(kernel);
}
+ if(dump_file)
+ {
+ child_cfun = DECL_STRUCT_FUNCTION(child_fn);
+ push_cfun(child_cfun);
+ dump_fn_body(dump_file, "ORIGINAL");
+ fflush(dump_file);
+ pop_cfun();
+ }
+
for(i = 0; i < nloops - 1; ++i)
{
edge exit_loop = single_exit(vloops[i]);
- basic_block new_bb, before, after;
+ basic_block new_bb, before, after, imm_dom;
gimple_stmt_iterator gsi;
before = exit_loop->src;
- after = exit_loop->dest;
- new_bb = create_empty_bb(before);
- add_bb_to_loop(new_bb, loops->tree_root);
- redirect_edge_and_branch(exit_loop, new_bb);
- make_single_succ_edge(new_bb, after, EDGE_FALLTHRU);
- set_immediate_dominator (CDI_DOMINATORS, new_bb, before);
- set_immediate_dominator (CDI_DOMINATORS, after, new_bb);
- if(i > 0)
+ if(dump_file)
{
- gsi = gsi_last_bb(new_bb);
- gsi_insert_before(&gsi, gimple_build_return(NULL_TREE), GSI_SAME_STMT);
+ fprintf(dump_file, "before %d has %d successors\n",
+ before->index, EDGE_COUNT(before->succs));
+ }
+ if(!single_succ_p(before))
+ {
+ edge p;
+ edge_iterator ei;
+
+ after = exit_loop->dest;
+ if(dump_file)
+ {
+ fprintf(dump_file, "after %d has %d predecessors\n",
+ after->index, EDGE_COUNT(after->preds));
+ }
+ imm_dom = get_immediate_dominator(CDI_DOMINATORS, after);
+
+ new_bb = create_empty_bb(before);
+ add_bb_to_loop(new_bb, loops->tree_root);
+ redirect_edge_and_branch(exit_loop, new_bb);
+ make_single_succ_edge(new_bb, after, EDGE_FALLTHRU);
+
+ FOR_EACH_EDGE(p, ei, after->preds)
+ {
+ if(dump_file)
+ {
+ fprintf(dump_file, "edge %d -> %d\n", p->src->index, p->dest->index);
+ }
+ if(p->src->index != new_bb->index)
+ redirect_edge_and_branch(p, new_bb);
+ }
+
+ set_immediate_dominator (CDI_DOMINATORS, new_bb, imm_dom);
+ set_immediate_dominator (CDI_DOMINATORS, after, new_bb);
+ if(i > 0)
+ {
+ gsi = gsi_last_bb(new_bb);
+ gsi_insert_before(&gsi, gimple_build_return(NULL_TREE), GSI_SAME_STMT);
+ }
}
}
+
if(dump_file)
{
child_cfun = DECL_STRUCT_FUNCTION(child_fn);
push_cfun(child_cfun);
- dump_fn_body(dump_file, "ORIGINAL");
+ dump_fn_body(dump_file, "PADDING");
fflush(dump_file);
pop_cfun();
}
-
bb_entry = single_succ_edge(ENTRY_BLOCK_PTR)->dest;
for(i = 0; i < nloops; ++i)
{
@@ -1931,6 +1969,7 @@ extract_kernels(struct loops* loops, tree child_fn,
{
dump_fn_body(dump_file, "AFTER MOVE SESE");
dump_ssa(dump_file);
+ dump_dominators(dump_file, ENTRY_BLOCK_PTR, 0);
fflush(dump_file);
}
@@ -2515,6 +2554,7 @@ switch_func_back(int save_opt_level)
{
optimize = save_opt_level;
}
+ cleanup_tree_cfg();
FOR_EACH_BB(bb)
{
gimple_stmt_iterator gsi;