Commit 0995a441 by Steven Bosscher Committed by Daniel Berlin

re PR tree-optimization/21520 (missing PRE opportunity with operand after operand)



	Fix PR tree-optimization/21520
	* tree-ssa-pre.c (phi_translate): Use fully_constant_expression
	to attempt to fold constants.

From-SVN: r99632
parent 02f20dc3
2005-05-12 Steven Bosscher <stevenb@suse.de>
Fix PR tree-optimization/21520
* tree-ssa-pre.c (phi_translate): Use fully_constant_expression
to attempt to fold constants.
2005-05-12 Kaz Kojima <kkojima@gcc.gnu.org> 2005-05-12 Kaz Kojima <kkojima@gcc.gnu.org>
* config/sh/sh.c: Declare the prototype of sh_adjust_unroll_max * config/sh/sh.c: Declare the prototype of sh_adjust_unroll_max
......
int
bar (unsigned char key)
{
unsigned char buf[sizeof (unsigned long)+2];
unsigned char b;
unsigned char *buf_ = buf + 1;
for (b = 8; b != 0; b--)
buf_[b] = key >> b;
return foo (b);
}
...@@ -842,6 +842,19 @@ debug_value_set (value_set_t set, const char *setname, int blockindex) ...@@ -842,6 +842,19 @@ debug_value_set (value_set_t set, const char *setname, int blockindex)
print_value_set (stderr, set, setname, blockindex); print_value_set (stderr, set, setname, blockindex);
} }
/* Return the folded version of T if T, when folded, is a gimple
min_invariant. Otherwise, return T. */
static tree
fully_constant_expression (tree t)
{
tree folded;
folded = fold (t);
if (folded && is_gimple_min_invariant (folded))
return folded;
return t;
}
/* Translate EXPR using phis in PHIBLOCK, so that it has the values of /* Translate EXPR using phis in PHIBLOCK, so that it has the values of
the phis in PRED. Return NULL if we can't find a leader for each the phis in PRED. Return NULL if we can't find a leader for each
part of the translated expression. */ part of the translated expression. */
...@@ -889,12 +902,22 @@ phi_translate (tree expr, value_set_t set, basic_block pred, ...@@ -889,12 +902,22 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
return NULL; return NULL;
if (newop1 != oldop1 || newop2 != oldop2) if (newop1 != oldop1 || newop2 != oldop2)
{ {
tree t;
newexpr = pool_alloc (binary_node_pool); newexpr = pool_alloc (binary_node_pool);
memcpy (newexpr, expr, tree_size (expr)); memcpy (newexpr, expr, tree_size (expr));
create_tree_ann (newexpr);
TREE_OPERAND (newexpr, 0) = newop1 == oldop1 ? oldop1 : get_value_handle (newop1); TREE_OPERAND (newexpr, 0) = newop1 == oldop1 ? oldop1 : get_value_handle (newop1);
TREE_OPERAND (newexpr, 1) = newop2 == oldop2 ? oldop2 : get_value_handle (newop2); TREE_OPERAND (newexpr, 1) = newop2 == oldop2 ? oldop2 : get_value_handle (newop2);
vn_lookup_or_add (newexpr, NULL); t = fully_constant_expression (newexpr);
if (t != newexpr)
{
pool_free (binary_node_pool, newexpr);
newexpr = t;
}
else
{
create_tree_ann (newexpr);
vn_lookup_or_add (newexpr, NULL);
}
expr = newexpr; expr = newexpr;
phi_trans_add (oldexpr, newexpr, pred); phi_trans_add (oldexpr, newexpr, pred);
} }
...@@ -913,11 +936,21 @@ phi_translate (tree expr, value_set_t set, basic_block pred, ...@@ -913,11 +936,21 @@ phi_translate (tree expr, value_set_t set, basic_block pred,
return NULL; return NULL;
if (newop1 != oldop1) if (newop1 != oldop1)
{ {
tree t;
newexpr = pool_alloc (unary_node_pool); newexpr = pool_alloc (unary_node_pool);
memcpy (newexpr, expr, tree_size (expr)); memcpy (newexpr, expr, tree_size (expr));
create_tree_ann (newexpr);
TREE_OPERAND (newexpr, 0) = get_value_handle (newop1); TREE_OPERAND (newexpr, 0) = get_value_handle (newop1);
vn_lookup_or_add (newexpr, NULL); t = fully_constant_expression (newexpr);
if (t != newexpr)
{
pool_free (unary_node_pool, newexpr);
newexpr = t;
}
else
{
create_tree_ann (newexpr);
vn_lookup_or_add (newexpr, NULL);
}
expr = newexpr; expr = newexpr;
phi_trans_add (oldexpr, newexpr, pred); phi_trans_add (oldexpr, newexpr, pred);
} }
...@@ -1412,19 +1445,6 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts) ...@@ -1412,19 +1445,6 @@ create_expression_by_pieces (basic_block block, tree expr, tree stmts)
return name; return name;
} }
/* Return the folded version of T if T, when folded, is a gimple
min_invariant. Otherwise, return T. */
static tree
fully_constant_expression (tree t)
{
tree folded;
folded = fold (t);
if (folded && is_gimple_min_invariant (folded))
return folded;
return t;
}
/* Insert the to-be-made-available values of NODE for each predecessor, stored /* Insert the to-be-made-available values of NODE for each predecessor, stored
in AVAIL, into the predecessors of BLOCK, and merge the result with a phi in AVAIL, into the predecessors of BLOCK, and merge the result with a phi
node, given the same value handle as NODE. The prefix of the phi node is node, given the same value handle as NODE. The prefix of the phi node is
......
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