Commit d78b7095 by Richard Biener Committed by Richard Biener

cfgloop.h (loop_iterator::~loop_iterator): Remove.

2019-11-21  Richard Biener  <rguenther@suse.de>

	* cfgloop.h (loop_iterator::~loop_iterator): Remove.
	(loop_iterator::to_visit): Use an auto_vec with internal storage.
	(loop_iterator::loop_iterator): Adjust.
	* cfganal.c (compute_dominance_frontiers_1): Fold into...
	(compute_dominance_frontiers): ... this.  Hoist invariant
	get_immediate_dominator call.
	(compute_idf): Use a work-set instead of a work-list for more
	optimal iteration order and duplicate avoidance.
	* tree-into-ssa.c (mark_phi_for_rewrite): Avoid re-allocating
	the vector all the time, instead pre-allocate the vector only
	once.
	(delete_update_ssa): Simplify.
	* vec.h (va_heap::release): Disable -Wfree-nonheap-object around it.

From-SVN: r278550
parent e2a05fdf
2019-11-21 Richard Biener <rguenther@suse.de>
* cfgloop.h (loop_iterator::~loop_iterator): Remove.
(loop_iterator::to_visit): Use an auto_vec with internal storage.
(loop_iterator::loop_iterator): Adjust.
* cfganal.c (compute_dominance_frontiers_1): Fold into...
(compute_dominance_frontiers): ... this. Hoist invariant
get_immediate_dominator call.
(compute_idf): Use a work-set instead of a work-list for more
optimal iteration order and duplicate avoidance.
* tree-into-ssa.c (mark_phi_for_rewrite): Avoid re-allocating
the vector all the time, instead pre-allocate the vector only
once.
(delete_update_ssa): Simplify.
* vec.h (va_heap::release): Disable -Wfree-nonheap-object around it.
2019-11-21 Jakub Jelinek <jakub@redhat.com> 2019-11-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91355 PR tree-optimization/91355
...@@ -1326,10 +1326,11 @@ dfs_enumerate_from (basic_block bb, int reverse, ...@@ -1326,10 +1326,11 @@ dfs_enumerate_from (basic_block bb, int reverse,
of the dominance frontiers, no more, no less. of the dominance frontiers, no more, no less.
*/ */
void
static void compute_dominance_frontiers (bitmap_head *frontiers)
compute_dominance_frontiers_1 (bitmap_head *frontiers)
{ {
timevar_push (TV_DOM_FRONTIERS);
edge p; edge p;
edge_iterator ei; edge_iterator ei;
basic_block b; basic_block b;
...@@ -1337,34 +1338,22 @@ compute_dominance_frontiers_1 (bitmap_head *frontiers) ...@@ -1337,34 +1338,22 @@ compute_dominance_frontiers_1 (bitmap_head *frontiers)
{ {
if (EDGE_COUNT (b->preds) >= 2) if (EDGE_COUNT (b->preds) >= 2)
{ {
basic_block domsb = get_immediate_dominator (CDI_DOMINATORS, b);
FOR_EACH_EDGE (p, ei, b->preds) FOR_EACH_EDGE (p, ei, b->preds)
{ {
basic_block runner = p->src; basic_block runner = p->src;
basic_block domsb;
if (runner == ENTRY_BLOCK_PTR_FOR_FN (cfun)) if (runner == ENTRY_BLOCK_PTR_FOR_FN (cfun))
continue; continue;
domsb = get_immediate_dominator (CDI_DOMINATORS, b);
while (runner != domsb) while (runner != domsb)
{ {
if (!bitmap_set_bit (&frontiers[runner->index], if (!bitmap_set_bit (&frontiers[runner->index], b->index))
b->index))
break; break;
runner = get_immediate_dominator (CDI_DOMINATORS, runner = get_immediate_dominator (CDI_DOMINATORS, runner);
runner);
} }
} }
} }
} }
}
void
compute_dominance_frontiers (bitmap_head *frontiers)
{
timevar_push (TV_DOM_FRONTIERS);
compute_dominance_frontiers_1 (frontiers);
timevar_pop (TV_DOM_FRONTIERS); timevar_pop (TV_DOM_FRONTIERS);
} }
...@@ -1385,25 +1374,26 @@ compute_idf (bitmap def_blocks, bitmap_head *dfs) ...@@ -1385,25 +1374,26 @@ compute_idf (bitmap def_blocks, bitmap_head *dfs)
unsigned bb_index, i; unsigned bb_index, i;
bitmap phi_insertion_points; bitmap phi_insertion_points;
/* Each block can appear at most twice on the work-stack. */
auto_vec<int> work_stack (2 * n_basic_blocks_for_fn (cfun));
phi_insertion_points = BITMAP_ALLOC (NULL); phi_insertion_points = BITMAP_ALLOC (NULL);
/* Seed the work list with all the blocks in DEF_BLOCKS. We use /* Seed the work set with all the blocks in DEF_BLOCKS. */
vec::quick_push here for speed. This is safe because we know that auto_bitmap work_set;
the number of definition blocks is no greater than the number of bitmap_copy (work_set, def_blocks);
basic blocks, which is the initial capacity of WORK_STACK. */ bitmap_tree_view (work_set);
EXECUTE_IF_SET_IN_BITMAP (def_blocks, 0, bb_index, bi)
work_stack.quick_push (bb_index);
/* Pop a block off the worklist, add every block that appears in /* Pop a block off the workset, add every block that appears in
the original block's DF that we have not already processed to the original block's DF that we have not already processed to
the worklist. Iterate until the worklist is empty. Blocks the workset. Iterate until the workset is empty. Blocks
which are added to the worklist are potential sites for which are added to the workset are potential sites for
PHI nodes. */ PHI nodes. */
while (work_stack.length () > 0) while (!bitmap_empty_p (work_set))
{ {
bb_index = work_stack.pop (); /* The dominance frontier of a block is blocks after it so iterating
on earlier blocks first is better.
??? Basic blocks are by no means guaranteed to be ordered in
optimal order for this iteration. */
bb_index = bitmap_first_set_bit (work_set);
bitmap_clear_bit (work_set, bb_index);
/* Since the registration of NEW -> OLD name mappings is done /* Since the registration of NEW -> OLD name mappings is done
separately from the call to update_ssa, when updating the SSA separately from the call to update_ssa, when updating the SSA
...@@ -1416,7 +1406,7 @@ compute_idf (bitmap def_blocks, bitmap_head *dfs) ...@@ -1416,7 +1406,7 @@ compute_idf (bitmap def_blocks, bitmap_head *dfs)
EXECUTE_IF_AND_COMPL_IN_BITMAP (&dfs[bb_index], phi_insertion_points, EXECUTE_IF_AND_COMPL_IN_BITMAP (&dfs[bb_index], phi_insertion_points,
0, i, bi) 0, i, bi)
{ {
work_stack.quick_push (i); bitmap_set_bit (work_set, i);
bitmap_set_bit (phi_insertion_points, i); bitmap_set_bit (phi_insertion_points, i);
} }
} }
......
...@@ -661,7 +661,6 @@ class loop_iterator ...@@ -661,7 +661,6 @@ class loop_iterator
{ {
public: public:
loop_iterator (function *fn, loop_p *loop, unsigned flags); loop_iterator (function *fn, loop_p *loop, unsigned flags);
~loop_iterator ();
inline loop_p next (); inline loop_p next ();
...@@ -669,7 +668,7 @@ public: ...@@ -669,7 +668,7 @@ public:
function *fn; function *fn;
/* The list of loops to visit. */ /* The list of loops to visit. */
vec<int> to_visit; auto_vec<int, 16> to_visit;
/* The index of the actual loop. */ /* The index of the actual loop. */
unsigned idx; unsigned idx;
...@@ -702,12 +701,11 @@ loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags) ...@@ -702,12 +701,11 @@ loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags)
this->fn = fn; this->fn = fn;
if (!loops_for_fn (fn)) if (!loops_for_fn (fn))
{ {
this->to_visit.create (0);
*loop = NULL; *loop = NULL;
return; return;
} }
this->to_visit.create (number_of_loops (fn)); this->to_visit.reserve_exact (number_of_loops (fn));
mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1; mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
if (flags & LI_ONLY_INNERMOST) if (flags & LI_ONLY_INNERMOST)
...@@ -769,12 +767,6 @@ loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags) ...@@ -769,12 +767,6 @@ loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags)
*loop = this->next (); *loop = this->next ();
} }
inline
loop_iterator::~loop_iterator ()
{
this->to_visit.release ();
}
#define FOR_EACH_LOOP(LOOP, FLAGS) \ #define FOR_EACH_LOOP(LOOP, FLAGS) \
for (loop_iterator li(cfun, &(LOOP), FLAGS); \ for (loop_iterator li(cfun, &(LOOP), FLAGS); \
(LOOP); \ (LOOP); \
......
...@@ -940,14 +940,18 @@ mark_phi_for_rewrite (basic_block bb, gphi *phi) ...@@ -940,14 +940,18 @@ mark_phi_for_rewrite (basic_block bb, gphi *phi)
if (!blocks_with_phis_to_rewrite) if (!blocks_with_phis_to_rewrite)
return; return;
bitmap_set_bit (blocks_with_phis_to_rewrite, idx); if (bitmap_set_bit (blocks_with_phis_to_rewrite, idx))
{
n = (unsigned) last_basic_block_for_fn (cfun) + 1; n = (unsigned) last_basic_block_for_fn (cfun) + 1;
if (phis_to_rewrite.length () < n) if (phis_to_rewrite.length () < n)
phis_to_rewrite.safe_grow_cleared (n); phis_to_rewrite.safe_grow_cleared (n);
phis = phis_to_rewrite[idx]; phis = phis_to_rewrite[idx];
phis.reserve (10); gcc_assert (!phis.exists ());
phis.create (10);
}
else
phis = phis_to_rewrite[idx];
phis.safe_push (phi); phis.safe_push (phi);
phis_to_rewrite[idx] = phis; phis_to_rewrite[idx] = phis;
...@@ -2937,11 +2941,7 @@ delete_update_ssa (void) ...@@ -2937,11 +2941,7 @@ delete_update_ssa (void)
if (blocks_with_phis_to_rewrite) if (blocks_with_phis_to_rewrite)
EXECUTE_IF_SET_IN_BITMAP (blocks_with_phis_to_rewrite, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (blocks_with_phis_to_rewrite, 0, i, bi)
{ phis_to_rewrite[i].release ();
vec<gphi *> phis = phis_to_rewrite[i];
phis.release ();
phis_to_rewrite[i].create (0);
}
BITMAP_FREE (blocks_with_phis_to_rewrite); BITMAP_FREE (blocks_with_phis_to_rewrite);
BITMAP_FREE (blocks_to_update); BITMAP_FREE (blocks_to_update);
......
...@@ -295,6 +295,11 @@ va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact ...@@ -295,6 +295,11 @@ va_heap::reserve (vec<T, va_heap, vl_embed> *&v, unsigned reserve, bool exact
} }
#if GCC_VERSION >= 4007
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wfree-nonheap-object"
#endif
/* Free the heap space allocated for vector V. */ /* Free the heap space allocated for vector V. */
template<typename T> template<typename T>
...@@ -312,6 +317,9 @@ va_heap::release (vec<T, va_heap, vl_embed> *&v) ...@@ -312,6 +317,9 @@ va_heap::release (vec<T, va_heap, vl_embed> *&v)
v = NULL; v = NULL;
} }
#if GCC_VERSION >= 4007
#pragma GCC diagnostic pop
#endif
/* Allocator type for GC vectors. Notice that we need the structure /* Allocator type for GC vectors. Notice that we need the structure
declaration even if GC is not enabled. */ declaration even if GC is not enabled. */
......
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