Commit fba62120 by Bill Schmidt Committed by William Schmidt

re PR tree-optimization/52976 (Revision 186384 breaks the polyhedron tests…

re PR tree-optimization/52976 (Revision 186384 breaks the polyhedron tests aermod.f90 and doduc.f90 at -O3 -ffast-math)

2012-04-16  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

	PR tree-optimization/52976
	* tree-ssa-reassoc.c (add_to_ops_vec_max_rank): New function.
	(undistribute_ops_list): Ops with repeat counts aren't eligible for
	undistribution.
	(attempt_builtin_powi): Call add_to_ops_vec_max_rank.

From-SVN: r186493
parent 65c70e6b
2012-04-16 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/52976
* tree-ssa-reassoc.c (add_to_ops_vec_max_rank): New function.
(undistribute_ops_list): Ops with repeat counts aren't eligible for
undistribution.
(attempt_builtin_powi): Call add_to_ops_vec_max_rank.
2012-04-16 Jan Hubicka <jh@suse.cz> 2012-04-16 Jan Hubicka <jh@suse.cz>
* cgraph.h (FOR_EACH_VARIABLE, FOR_EACH_VARIABLE, FOR_EACH_FUNCTION): * cgraph.h (FOR_EACH_VARIABLE, FOR_EACH_VARIABLE, FOR_EACH_FUNCTION):
......
...@@ -544,6 +544,28 @@ add_repeat_to_ops_vec (VEC(operand_entry_t, heap) **ops, tree op, ...@@ -544,6 +544,28 @@ add_repeat_to_ops_vec (VEC(operand_entry_t, heap) **ops, tree op,
reassociate_stats.pows_encountered++; reassociate_stats.pows_encountered++;
} }
/* Add an operand entry to *OPS for the tree operand OP, giving the
new entry a larger rank than any other operand already in *OPS. */
static void
add_to_ops_vec_max_rank (VEC(operand_entry_t, heap) **ops, tree op)
{
operand_entry_t oe = (operand_entry_t) pool_alloc (operand_entry_pool);
operand_entry_t oe1;
unsigned i;
unsigned max_rank = 0;
FOR_EACH_VEC_ELT (operand_entry_t, *ops, i, oe1)
if (oe1->rank > max_rank)
max_rank = oe1->rank;
oe->op = op;
oe->rank = max_rank + 1;
oe->id = next_operand_entry_id++;
oe->count = 1;
VEC_safe_push (operand_entry_t, heap, *ops, oe);
}
/* Return true if STMT is reassociable operation containing a binary /* Return true if STMT is reassociable operation containing a binary
operation with tree code CODE, and is inside LOOP. */ operation with tree code CODE, and is inside LOOP. */
...@@ -1200,6 +1222,7 @@ undistribute_ops_list (enum tree_code opcode, ...@@ -1200,6 +1222,7 @@ undistribute_ops_list (enum tree_code opcode,
dcode = gimple_assign_rhs_code (oe1def); dcode = gimple_assign_rhs_code (oe1def);
if ((dcode != MULT_EXPR if ((dcode != MULT_EXPR
&& dcode != RDIV_EXPR) && dcode != RDIV_EXPR)
|| oe1->count != 1
|| !is_reassociable_op (oe1def, dcode, loop)) || !is_reassociable_op (oe1def, dcode, loop))
continue; continue;
...@@ -1243,6 +1266,8 @@ undistribute_ops_list (enum tree_code opcode, ...@@ -1243,6 +1266,8 @@ undistribute_ops_list (enum tree_code opcode,
oecount c; oecount c;
void **slot; void **slot;
size_t idx; size_t idx;
if (oe1->count != 1)
continue;
c.oecode = oecode; c.oecode = oecode;
c.cnt = 1; c.cnt = 1;
c.id = next_oecount_id++; c.id = next_oecount_id++;
...@@ -1311,7 +1336,7 @@ undistribute_ops_list (enum tree_code opcode, ...@@ -1311,7 +1336,7 @@ undistribute_ops_list (enum tree_code opcode,
FOR_EACH_VEC_ELT (operand_entry_t, subops[i], j, oe1) FOR_EACH_VEC_ELT (operand_entry_t, subops[i], j, oe1)
{ {
if (oe1->op == c->op) if (oe1->op == c->op && oe1->count == 1)
{ {
SET_BIT (candidates2, i); SET_BIT (candidates2, i);
++nr_candidates2; ++nr_candidates2;
...@@ -3275,8 +3300,10 @@ attempt_builtin_powi (gimple stmt, VEC(operand_entry_t, heap) **ops, ...@@ -3275,8 +3300,10 @@ attempt_builtin_powi (gimple stmt, VEC(operand_entry_t, heap) **ops,
gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT);
} }
/* Append the result of this iteration to the ops vector. */ /* Append the result of this iteration to the ops vector.
add_to_ops_vec (ops, iter_result); Give it a rank higher than all other ranks in the ops vector
so that all uses of it will be forced to come after it. */
add_to_ops_vec_max_rank (ops, iter_result);
/* Decrement the occurrence count of each element in the product /* Decrement the occurrence count of each element in the product
by the count found above, and remove this many copies of each by the count found above, and remove this many copies of each
......
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