Commit 6fc5966f by Alexander Monakov Committed by Alexander Monakov

re PR target/49349 (gfortran.dg/char_result_3.f90 fails with -O3)

	PR target/49349
	* sel-sched.c (find_place_for_bookkeeping): Add new parameter
	(fence_to_rewind).  Use it to notice when bookkeeping will be placed
	above a fence.  Update comments.
	(generate_bookkeeping_insn): Rewind fence when bookkeeping code is
	placed just above it.  Do not allow NULL place_to_insert.

From-SVN: r175075
parent 9d5e7640
2011-06-15 Alexander Monakov <amonakov@ispras.ru>
PR target/49349
* sel-sched.c (find_place_for_bookkeeping): Add new parameter
(fence_to_rewind). Use it to notice when bookkeeping will be placed
above a fence. Update comments.
(generate_bookkeeping_insn): Rewind fence when bookkeeping code is
placed just above it. Do not allow NULL place_to_insert.
2011-06-15 Ira Rosen <ira.rosen@linaro.org> 2011-06-15 Ira Rosen <ira.rosen@linaro.org>
* tree-vect-loop-manip.c (remove_dead_stmts_from_loop): Remove. * tree-vect-loop-manip.c (remove_dead_stmts_from_loop): Remove.
......
...@@ -4663,9 +4663,10 @@ create_block_for_bookkeeping (edge e1, edge e2) ...@@ -4663,9 +4663,10 @@ create_block_for_bookkeeping (edge e1, edge e2)
} }
/* Return insn after which we must insert bookkeeping code for path(s) incoming /* Return insn after which we must insert bookkeeping code for path(s) incoming
into E2->dest, except from E1->src. */ into E2->dest, except from E1->src. If the returned insn immediately
precedes a fence, assign that fence to *FENCE_TO_REWIND. */
static insn_t static insn_t
find_place_for_bookkeeping (edge e1, edge e2) find_place_for_bookkeeping (edge e1, edge e2, fence_t *fence_to_rewind)
{ {
insn_t place_to_insert; insn_t place_to_insert;
/* Find a basic block that can hold bookkeeping. If it can be found, do not /* Find a basic block that can hold bookkeeping. If it can be found, do not
...@@ -4707,9 +4708,14 @@ find_place_for_bookkeeping (edge e1, edge e2) ...@@ -4707,9 +4708,14 @@ find_place_for_bookkeeping (edge e1, edge e2)
sel_print ("Pre-existing bookkeeping block is %i\n", book_block->index); sel_print ("Pre-existing bookkeeping block is %i\n", book_block->index);
} }
/* If basic block ends with a jump, insert bookkeeping code right before it. */ *fence_to_rewind = NULL;
/* If basic block ends with a jump, insert bookkeeping code right before it.
Notice if we are crossing a fence when taking PREV_INSN. */
if (INSN_P (place_to_insert) && control_flow_insn_p (place_to_insert)) if (INSN_P (place_to_insert) && control_flow_insn_p (place_to_insert))
place_to_insert = PREV_INSN (place_to_insert); {
*fence_to_rewind = flist_lookup (fences, place_to_insert);
place_to_insert = PREV_INSN (place_to_insert);
}
return place_to_insert; return place_to_insert;
} }
...@@ -4784,21 +4790,23 @@ generate_bookkeeping_insn (expr_t c_expr, edge e1, edge e2) ...@@ -4784,21 +4790,23 @@ generate_bookkeeping_insn (expr_t c_expr, edge e1, edge e2)
insn_t join_point, place_to_insert, new_insn; insn_t join_point, place_to_insert, new_insn;
int new_seqno; int new_seqno;
bool need_to_exchange_data_sets; bool need_to_exchange_data_sets;
fence_t fence_to_rewind;
if (sched_verbose >= 4) if (sched_verbose >= 4)
sel_print ("Generating bookkeeping insn (%d->%d)\n", e1->src->index, sel_print ("Generating bookkeeping insn (%d->%d)\n", e1->src->index,
e2->dest->index); e2->dest->index);
join_point = sel_bb_head (e2->dest); join_point = sel_bb_head (e2->dest);
place_to_insert = find_place_for_bookkeeping (e1, e2); place_to_insert = find_place_for_bookkeeping (e1, e2, &fence_to_rewind);
if (!place_to_insert)
return NULL;
new_seqno = find_seqno_for_bookkeeping (place_to_insert, join_point); new_seqno = find_seqno_for_bookkeeping (place_to_insert, join_point);
need_to_exchange_data_sets need_to_exchange_data_sets
= sel_bb_empty_p (BLOCK_FOR_INSN (place_to_insert)); = sel_bb_empty_p (BLOCK_FOR_INSN (place_to_insert));
new_insn = emit_bookkeeping_insn (place_to_insert, c_expr, new_seqno); new_insn = emit_bookkeeping_insn (place_to_insert, c_expr, new_seqno);
if (fence_to_rewind)
FENCE_INSN (fence_to_rewind) = new_insn;
/* When inserting bookkeeping insn in new block, av sets should be /* When inserting bookkeeping insn in new block, av sets should be
following: old basic block (that now holds bookkeeping) data sets are following: old basic block (that now holds bookkeeping) data sets are
the same as was before generation of bookkeeping, and new basic block the same as was before generation of bookkeeping, and new basic block
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment