Commit 18965703 by Zdenek Dvorak Committed by Zdenek Dvorak

tree-scalar-evolution.c (scev_const_prop): Do not create labels.

	* tree-scalar-evolution.c (scev_const_prop): Do not create labels.
	* tree-ssa-sink.c (statement_sink_location): Return basic block and
	bsi of the location where statements should be inserted.
	(sink_code_in_bb): Take bsi from statement_sink_location.
	* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Use bsi_after_labels
	instead of bsi_start.
	* tree-profile.c (tree_gen_ic_func_profiler): Pass BSI_NEW_STMT to
	bsi_insert_after.
	* tree-cfg.c (bsi_move_after): Pass BSI_NEW_STMT to bsi_insert_after.
	(bsi_move_before): Document inconsistency with bsi_move_after.
	(tree_redirect_edge_and_branch): Do not create labels if not necessary.

From-SVN: r125181
parent 0a1c5e55
2007-05-30 Zdenek Dvorak <dvorakz@suse.cz>
* tree-scalar-evolution.c (scev_const_prop): Do not create labels.
* tree-ssa-sink.c (statement_sink_location): Return basic block and
bsi of the location where statements should be inserted.
(sink_code_in_bb): Take bsi from statement_sink_location.
* lambda-code.c (lambda_loopnest_to_gcc_loopnest): Use bsi_after_labels
instead of bsi_start.
* tree-profile.c (tree_gen_ic_func_profiler): Pass BSI_NEW_STMT to
bsi_insert_after.
* tree-cfg.c (bsi_move_after): Pass BSI_NEW_STMT to bsi_insert_after.
(bsi_move_before): Document inconsistency with bsi_move_after.
(tree_redirect_edge_and_branch): Do not create labels if not necessary.
2007-05-30 Uros Bizjak <ubizjak@gmail.com> 2007-05-30 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.h (TARGET_ABM): New define. * config/i386/i386.h (TARGET_ABM): New define.
......
...@@ -1881,8 +1881,8 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest, ...@@ -1881,8 +1881,8 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest,
exit = single_exit (temp); exit = single_exit (temp);
exitcond = get_loop_exit_condition (temp); exitcond = get_loop_exit_condition (temp);
bb = bb_for_stmt (exitcond); bb = bb_for_stmt (exitcond);
bsi = bsi_start (bb); bsi = bsi_after_labels (bb);
bsi_insert_after (&bsi, stmts, BSI_NEW_STMT); bsi_insert_before (&bsi, stmts, BSI_NEW_STMT);
/* Create the new iv. */ /* Create the new iv. */
......
...@@ -2776,7 +2776,9 @@ bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to) ...@@ -2776,7 +2776,9 @@ bsi_move_after (block_stmt_iterator *from, block_stmt_iterator *to)
{ {
tree stmt = bsi_stmt (*from); tree stmt = bsi_stmt (*from);
bsi_remove (from, false); bsi_remove (from, false);
bsi_insert_after (to, stmt, BSI_SAME_STMT); /* We must have BSI_NEW_STMT here, as bsi_move_after is sometimes used to
move statements to an empty block. */
bsi_insert_after (to, stmt, BSI_NEW_STMT);
} }
...@@ -2787,6 +2789,9 @@ bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to) ...@@ -2787,6 +2789,9 @@ bsi_move_before (block_stmt_iterator *from, block_stmt_iterator *to)
{ {
tree stmt = bsi_stmt (*from); tree stmt = bsi_stmt (*from);
bsi_remove (from, false); bsi_remove (from, false);
/* For consistency with bsi_move_after, it might be better to have
BSI_NEW_STMT here; however, that breaks several places that expect
that TO does not change. */
bsi_insert_before (to, stmt, BSI_SAME_STMT); bsi_insert_before (to, stmt, BSI_SAME_STMT);
} }
...@@ -3993,7 +3998,7 @@ tree_redirect_edge_and_branch (edge e, basic_block dest) ...@@ -3993,7 +3998,7 @@ tree_redirect_edge_and_branch (edge e, basic_block dest)
basic_block bb = e->src; basic_block bb = e->src;
block_stmt_iterator bsi; block_stmt_iterator bsi;
edge ret; edge ret;
tree label, stmt; tree stmt;
if (e->flags & EDGE_ABNORMAL) if (e->flags & EDGE_ABNORMAL)
return NULL; return NULL;
...@@ -4005,8 +4010,6 @@ tree_redirect_edge_and_branch (edge e, basic_block dest) ...@@ -4005,8 +4010,6 @@ tree_redirect_edge_and_branch (edge e, basic_block dest)
if (e->dest == dest) if (e->dest == dest)
return NULL; return NULL;
label = tree_block_label (dest);
bsi = bsi_last (bb); bsi = bsi_last (bb);
stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi); stmt = bsi_end_p (bsi) ? NULL : bsi_stmt (bsi);
...@@ -4024,6 +4027,7 @@ tree_redirect_edge_and_branch (edge e, basic_block dest) ...@@ -4024,6 +4027,7 @@ tree_redirect_edge_and_branch (edge e, basic_block dest)
case SWITCH_EXPR: case SWITCH_EXPR:
{ {
tree cases = get_cases_for_edge (e, stmt); tree cases = get_cases_for_edge (e, stmt);
tree label = tree_block_label (dest);
/* If we have a list of cases associated with E, then use it /* If we have a list of cases associated with E, then use it
as it's a lot faster than walking the entire case vector. */ as it's a lot faster than walking the entire case vector. */
......
...@@ -332,7 +332,7 @@ tree_gen_ic_func_profiler (void) ...@@ -332,7 +332,7 @@ tree_gen_ic_func_profiler (void)
tree_uid, tree_uid,
cur_func, cur_func,
ic_void_ptr_var); ic_void_ptr_var);
bsi_insert_after (&bsi, stmt1, BSI_SAME_STMT); bsi_insert_after (&bsi, stmt1, BSI_NEW_STMT);
} }
} }
......
...@@ -2968,7 +2968,6 @@ scev_const_prop (void) ...@@ -2968,7 +2968,6 @@ scev_const_prop (void)
/* Ensure that it is possible to insert new statements somewhere. */ /* Ensure that it is possible to insert new statements somewhere. */
if (!single_pred_p (exit->dest)) if (!single_pred_p (exit->dest))
split_loop_exit_edge (exit); split_loop_exit_edge (exit);
tree_block_label (exit->dest);
bsi = bsi_after_labels (exit->dest); bsi = bsi_after_labels (exit->dest);
ex_loop = superloop_at_depth (loop, ex_loop = superloop_at_depth (loop,
......
...@@ -263,11 +263,13 @@ nearest_common_dominator_of_uses (tree stmt) ...@@ -263,11 +263,13 @@ nearest_common_dominator_of_uses (tree stmt)
/* Given a statement (STMT) and the basic block it is currently in (FROMBB), /* Given a statement (STMT) and the basic block it is currently in (FROMBB),
determine the location to sink the statement to, if any. determine the location to sink the statement to, if any.
Return the basic block to sink it to, or NULL if we should not sink Returns true if there is such location; in that case, TOBB is set to the
it. */ basic block of the location, and TOBSI points to the statement before
that STMT should be moved. */
static tree static bool
statement_sink_location (tree stmt, basic_block frombb) statement_sink_location (tree stmt, basic_block frombb, basic_block *tobb,
block_stmt_iterator *tobsi)
{ {
tree use, def; tree use, def;
use_operand_p one_use = NULL_USE_OPERAND_P; use_operand_p one_use = NULL_USE_OPERAND_P;
...@@ -291,10 +293,10 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -291,10 +293,10 @@ statement_sink_location (tree stmt, basic_block frombb)
/* Return if there are no immediate uses of this stmt. */ /* Return if there are no immediate uses of this stmt. */
if (one_use == NULL_USE_OPERAND_P) if (one_use == NULL_USE_OPERAND_P)
return NULL; return false;
if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT) if (TREE_CODE (stmt) != GIMPLE_MODIFY_STMT)
return NULL; return false;
rhs = GIMPLE_STMT_OPERAND (stmt, 1); rhs = GIMPLE_STMT_OPERAND (stmt, 1);
/* There are a few classes of things we can't or don't move, some because we /* There are a few classes of things we can't or don't move, some because we
...@@ -325,21 +327,21 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -325,21 +327,21 @@ statement_sink_location (tree stmt, basic_block frombb)
|| is_hidden_global_store (stmt) || is_hidden_global_store (stmt)
|| ann->has_volatile_ops || ann->has_volatile_ops
|| !ZERO_SSA_OPERANDS (stmt, SSA_OP_VUSE)) || !ZERO_SSA_OPERANDS (stmt, SSA_OP_VUSE))
return NULL; return false;
FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS) FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
{ {
tree def = DEF_FROM_PTR (def_p); tree def = DEF_FROM_PTR (def_p);
if (is_global_var (SSA_NAME_VAR (def)) if (is_global_var (SSA_NAME_VAR (def))
|| SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def)) || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
return NULL; return false;
} }
FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
{ {
tree use = USE_FROM_PTR (use_p); tree use = USE_FROM_PTR (use_p);
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use)) if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use))
return NULL; return false;
} }
/* If all the immediate uses are not in the same place, find the nearest /* If all the immediate uses are not in the same place, find the nearest
...@@ -351,13 +353,13 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -351,13 +353,13 @@ statement_sink_location (tree stmt, basic_block frombb)
basic_block commondom = nearest_common_dominator_of_uses (stmt); basic_block commondom = nearest_common_dominator_of_uses (stmt);
if (commondom == frombb) if (commondom == frombb)
return NULL; return false;
/* Our common dominator has to be dominated by frombb in order to be a /* Our common dominator has to be dominated by frombb in order to be a
trivially safe place to put this statement, since it has multiple trivially safe place to put this statement, since it has multiple
uses. */ uses. */
if (!dominated_by_p (CDI_DOMINATORS, commondom, frombb)) if (!dominated_by_p (CDI_DOMINATORS, commondom, frombb))
return NULL; return false;
/* It doesn't make sense to move to a dominator that post-dominates /* It doesn't make sense to move to a dominator that post-dominates
frombb, because it means we've just moved it into a path that always frombb, because it means we've just moved it into a path that always
...@@ -367,17 +369,19 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -367,17 +369,19 @@ statement_sink_location (tree stmt, basic_block frombb)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Not moving store, common dominator post-dominates from block.\n"); fprintf (dump_file, "Not moving store, common dominator post-dominates from block.\n");
return NULL; return false;
} }
if (commondom == frombb || commondom->loop_depth > frombb->loop_depth) if (commondom == frombb || commondom->loop_depth > frombb->loop_depth)
return NULL; return false;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
fprintf (dump_file, "Common dominator of all uses is %d\n", fprintf (dump_file, "Common dominator of all uses is %d\n",
commondom->index); commondom->index);
} }
return first_stmt (commondom); *tobb = commondom;
*tobsi = bsi_after_labels (commondom);
return true;
} }
use = USE_STMT (one_use); use = USE_STMT (one_use);
...@@ -386,8 +390,10 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -386,8 +390,10 @@ statement_sink_location (tree stmt, basic_block frombb)
sinkbb = bb_for_stmt (use); sinkbb = bb_for_stmt (use);
if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth
|| sinkbb->loop_father != frombb->loop_father) || sinkbb->loop_father != frombb->loop_father)
return NULL; return false;
return use; *tobb = sinkbb;
*tobsi = bsi_for_stmt (use);
return true;
} }
/* Note that at this point, all uses must be in the same statement, so it /* Note that at this point, all uses must be in the same statement, so it
...@@ -395,10 +401,9 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -395,10 +401,9 @@ statement_sink_location (tree stmt, basic_block frombb)
FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS) FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
break; break;
sinkbb = find_bb_for_arg (use, def); sinkbb = find_bb_for_arg (use, def);
if (!sinkbb) if (!sinkbb)
return NULL; return false;
/* This will happen when you have /* This will happen when you have
a_3 = PHI <a_13, a_26> a_3 = PHI <a_13, a_26>
...@@ -409,12 +414,15 @@ statement_sink_location (tree stmt, basic_block frombb) ...@@ -409,12 +414,15 @@ statement_sink_location (tree stmt, basic_block frombb)
we can't sink it. */ we can't sink it. */
if (bb_for_stmt (use) == frombb) if (bb_for_stmt (use) == frombb)
return NULL; return false;
if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth if (sinkbb == frombb || sinkbb->loop_depth > frombb->loop_depth
|| sinkbb->loop_father != frombb->loop_father) || sinkbb->loop_father != frombb->loop_father)
return NULL; return false;
*tobb = sinkbb;
*tobsi = bsi_after_labels (sinkbb);
return first_stmt (sinkbb); return true;
} }
/* Perform code sinking on BB */ /* Perform code sinking on BB */
...@@ -441,10 +449,9 @@ sink_code_in_bb (basic_block bb) ...@@ -441,10 +449,9 @@ sink_code_in_bb (basic_block bb)
{ {
tree stmt = bsi_stmt (bsi); tree stmt = bsi_stmt (bsi);
block_stmt_iterator tobsi; block_stmt_iterator tobsi;
tree sinkstmt; basic_block tobb;
sinkstmt = statement_sink_location (stmt, bb); if (!statement_sink_location (stmt, bb, &tobb, &tobsi))
if (!sinkstmt)
{ {
if (!bsi_end_p (bsi)) if (!bsi_end_p (bsi))
bsi_prev (&bsi); bsi_prev (&bsi);
...@@ -455,18 +462,13 @@ sink_code_in_bb (basic_block bb) ...@@ -455,18 +462,13 @@ sink_code_in_bb (basic_block bb)
fprintf (dump_file, "Sinking "); fprintf (dump_file, "Sinking ");
print_generic_expr (dump_file, stmt, TDF_VOPS); print_generic_expr (dump_file, stmt, TDF_VOPS);
fprintf (dump_file, " from bb %d to bb %d\n", fprintf (dump_file, " from bb %d to bb %d\n",
bb->index, bb_for_stmt (sinkstmt)->index); bb->index, tobb->index);
} }
tobsi = bsi_for_stmt (sinkstmt);
/* Find the first non-label. */
while (!bsi_end_p (tobsi)
&& TREE_CODE (bsi_stmt (tobsi)) == LABEL_EXPR)
bsi_next (&tobsi);
/* If this is the end of the basic block, we need to insert at the end /* If this is the end of the basic block, we need to insert at the end
of the basic block. */ of the basic block. */
if (bsi_end_p (tobsi)) if (bsi_end_p (tobsi))
bsi_move_to_bb_end (&bsi, bb_for_stmt (sinkstmt)); bsi_move_to_bb_end (&bsi, tobb);
else else
bsi_move_before (&bsi, &tobsi); bsi_move_before (&bsi, &tobsi);
......
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