+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):
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. */
dcode = gimple_assign_rhs_code (oe1def);
if ((dcode != MULT_EXPR
&& dcode != RDIV_EXPR)
+ || oe1->count != 1
|| !is_reassociable_op (oe1def, dcode, loop))
continue;
oecount c;
void **slot;
size_t idx;
+ if (oe1->count != 1)
+ continue;
c.oecode = oecode;
c.cnt = 1;
c.id = next_oecount_id++;
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;
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