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
This commit is contained in:
parent
65c70e6b03
commit
fba621209f
2 changed files with 38 additions and 3 deletions
|
@ -1,3 +1,11 @@
|
|||
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>
|
||||
|
||||
* 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,
|
|||
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
|
||||
operation with tree code CODE, and is inside LOOP. */
|
||||
|
||||
|
@ -1200,6 +1222,7 @@ undistribute_ops_list (enum tree_code opcode,
|
|||
dcode = gimple_assign_rhs_code (oe1def);
|
||||
if ((dcode != MULT_EXPR
|
||||
&& dcode != RDIV_EXPR)
|
||||
|| oe1->count != 1
|
||||
|| !is_reassociable_op (oe1def, dcode, loop))
|
||||
continue;
|
||||
|
||||
|
@ -1243,6 +1266,8 @@ undistribute_ops_list (enum tree_code opcode,
|
|||
oecount c;
|
||||
void **slot;
|
||||
size_t idx;
|
||||
if (oe1->count != 1)
|
||||
continue;
|
||||
c.oecode = oecode;
|
||||
c.cnt = 1;
|
||||
c.id = next_oecount_id++;
|
||||
|
@ -1311,7 +1336,7 @@ undistribute_ops_list (enum tree_code opcode,
|
|||
|
||||
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);
|
||||
++nr_candidates2;
|
||||
|
@ -3275,8 +3300,10 @@ attempt_builtin_powi (gimple stmt, VEC(operand_entry_t, heap) **ops,
|
|||
gsi_insert_before (&gsi, pow_stmt, GSI_SAME_STMT);
|
||||
}
|
||||
|
||||
/* Append the result of this iteration to the ops vector. */
|
||||
add_to_ops_vec (ops, iter_result);
|
||||
/* Append the result of this iteration to the ops vector.
|
||||
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
|
||||
by the count found above, and remove this many copies of each
|
||||
|
|
Loading…
Add table
Reference in a new issue