-2012-08-03 Marc Glisse <marc.glisse@inria.fr>
+2012-08-03 Michael Matz <matz@suse.de>
+
+ PR tree-optimization/54146
+ * cfgexpand.c (add_scope_conflicts_1): Use bitmap_ior_into.
+ (add_scope_conflicts): Iterate in RPO order.
+ (add_stack_protection_conflicts): Iterate over the other triangle.
+ (fini_vars_expansion): Clear stack_vars_sorted.
+
+2012-08-03 Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/30318
* double-int.c (mul_double_wide_with_sign): New function.
unsigned i;
EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi)
{
- unsigned j;
- bitmap_iterator bj;
- EXECUTE_IF_SET_IN_BITMAP (work, i + 1, j, bj)
- add_stack_var_conflict (i, j);
+ struct stack_var *a = &stack_vars[i];
+ if (!a->conflicts)
+ a->conflicts = BITMAP_ALLOC (NULL);
+ bitmap_ior_into (a->conflicts, work);
}
visit = visit_conflict;
}
basic_block bb;
bool changed;
bitmap work = BITMAP_ALLOC (NULL);
+ int *rpo;
+ int n_bbs;
/* We approximate the live range of a stack variable by taking the first
mention of its name as starting point(s), and by the end-of-scope
FOR_ALL_BB (bb)
bb->aux = BITMAP_ALLOC (NULL);
+ rpo = XNEWVEC (int, last_basic_block);
+ n_bbs = pre_and_rev_post_order_compute (NULL, rpo, false);
+
changed = true;
while (changed)
{
+ int i;
changed = false;
- FOR_EACH_BB (bb)
+ for (i = 0; i < n_bbs; i++)
{
- bitmap active = (bitmap)bb->aux;
+ bitmap active;
+ bb = BASIC_BLOCK (rpo[i]);
+ active = (bitmap)bb->aux;
add_scope_conflicts_1 (bb, work, false);
if (bitmap_ior_into (active, work))
changed = true;
FOR_EACH_BB (bb)
add_scope_conflicts_1 (bb, work, true);
+ free (rpo);
BITMAP_FREE (work);
FOR_ALL_BB (bb)
BITMAP_FREE (bb->aux);
for (i = 0; i < n; ++i)
{
unsigned char ph_i = phase[i];
- for (j = 0; j < i; ++j)
+ for (j = i + 1; j < n; ++j)
if (ph_i != phase[j])
add_stack_var_conflict (i, j);
}
XDELETEVEC (stack_vars);
XDELETEVEC (stack_vars_sorted);
stack_vars = NULL;
+ stack_vars_sorted = NULL;
stack_vars_alloc = stack_vars_num = 0;
pointer_map_destroy (decl_to_stack_part);
decl_to_stack_part = NULL;