Commit 27d79c21 by Richard Biener Committed by Richard Biener

tree-ssa-pre.c (phi_translate_1): Avoid re-allocating the operands vector in most cases.

2014-09-01  Richard Biener  <rguenther@suse.de>

	* tree-ssa-pre.c (phi_translate_1): Avoid re-allocating the
	operands vector in most cases.  Remove redundant code.

From-SVN: r214794
parent d3b3d993
2014-09-01 Richard Biener <rguenther@suse.de>
* tree-ssa-pre.c (phi_translate_1): Avoid re-allocating the
operands vector in most cases. Remove redundant code.
2014-09-01 Olivier Hainque <hainque@adacore.com> 2014-09-01 Olivier Hainque <hainque@adacore.com>
* config/vxworksae.h (VXWORKSAE_TARGET_DIR): Rely on * config/vxworksae.h (VXWORKSAE_TARGET_DIR): Rely on
...@@ -1536,12 +1536,11 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, ...@@ -1536,12 +1536,11 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
tree newvuse = vuse; tree newvuse = vuse;
vec<vn_reference_op_s> newoperands = vNULL; vec<vn_reference_op_s> newoperands = vNULL;
bool changed = false, same_valid = true; bool changed = false, same_valid = true;
unsigned int i, j, n; unsigned int i, n;
vn_reference_op_t operand; vn_reference_op_t operand;
vn_reference_t newref; vn_reference_t newref;
for (i = 0, j = 0; for (i = 0; operands.iterate (i, &operand); i++)
operands.iterate (i, &operand); i++, j++)
{ {
pre_expr opresult; pre_expr opresult;
pre_expr leader; pre_expr leader;
...@@ -1585,6 +1584,8 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, ...@@ -1585,6 +1584,8 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
newoperands.release (); newoperands.release ();
return NULL; return NULL;
} }
if (!changed)
continue;
if (!newoperands.exists ()) if (!newoperands.exists ())
newoperands = operands.copy (); newoperands = operands.copy ();
/* We may have changed from an SSA_NAME to a constant */ /* We may have changed from an SSA_NAME to a constant */
...@@ -1594,36 +1595,14 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, ...@@ -1594,36 +1595,14 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
newop.op0 = op[0]; newop.op0 = op[0];
newop.op1 = op[1]; newop.op1 = op[1];
newop.op2 = op[2]; newop.op2 = op[2];
/* If it transforms a non-constant ARRAY_REF into a constant newoperands[i] = newop;
one, adjust the constant offset. */
if (newop.opcode == ARRAY_REF
&& newop.off == -1
&& TREE_CODE (op[0]) == INTEGER_CST
&& TREE_CODE (op[1]) == INTEGER_CST
&& TREE_CODE (op[2]) == INTEGER_CST)
{
offset_int off = ((wi::to_offset (op[0])
- wi::to_offset (op[1]))
* wi::to_offset (op[2]));
if (wi::fits_shwi_p (off))
newop.off = off.to_shwi ();
}
newoperands[j] = newop;
/* If it transforms from an SSA_NAME to an address, fold with
a preceding indirect reference. */
if (j > 0 && op[0] && TREE_CODE (op[0]) == ADDR_EXPR
&& newoperands[j - 1].opcode == MEM_REF)
vn_reference_fold_indirect (&newoperands, &j);
}
if (i != operands.length ())
{
newoperands.release ();
return NULL;
} }
gcc_checking_assert (i == operands.length ());
if (vuse) if (vuse)
{ {
newvuse = translate_vuse_through_block (newoperands, newvuse = translate_vuse_through_block (newoperands.exists ()
? newoperands : operands,
ref->set, ref->type, ref->set, ref->type,
vuse, phiblock, pred, vuse, phiblock, pred,
&same_valid); &same_valid);
...@@ -1641,7 +1620,8 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, ...@@ -1641,7 +1620,8 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
tree result = vn_reference_lookup_pieces (newvuse, ref->set, tree result = vn_reference_lookup_pieces (newvuse, ref->set,
ref->type, ref->type,
newoperands, newoperands.exists ()
? newoperands : operands,
&newref, VN_WALK); &newref, VN_WALK);
if (result) if (result)
newoperands.release (); newoperands.release ();
...@@ -1700,11 +1680,13 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, ...@@ -1700,11 +1680,13 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2,
} }
else else
new_val_id = ref->value_id; new_val_id = ref->value_id;
if (!newoperands.exists ())
newoperands = operands.copy ();
newref = vn_reference_insert_pieces (newvuse, ref->set, newref = vn_reference_insert_pieces (newvuse, ref->set,
ref->type, ref->type,
newoperands, newoperands,
result, new_val_id); result, new_val_id);
newoperands.create (0); newoperands = vNULL;
PRE_EXPR_REFERENCE (expr) = newref; PRE_EXPR_REFERENCE (expr) = newref;
constant = fully_constant_expression (expr); constant = fully_constant_expression (expr);
if (constant != expr) if (constant != expr)
......
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