ranger: Add shortcuts for single-successor blocks

When compiling an optabs.ii at -O2 with a release-checking build,
there were 6,643,575 calls to gimple_outgoing_range_stmt_p.  96.8% of
them were for blocks with a single successor, which never have a control
statement that generates new range info.  This patch therefore adds a
shortcut for that case.

This gives a ~1% compile-time improvement for the test.

I tried making the function inline (in the header) so that the
single_succ_p didn't need to be repeated, but it seemed to make things
slightly worse.

gcc/
	* gimple-range-edge.cc (gimple_outgoing_range::edge_range_p): Add
	a shortcut for blocks with single successors.
	* gimple-range-gori.cc (gori_map::calculate_gori): Likewise.
This commit is contained in:
Richard Sandiford 2021-12-06 18:29:31 +00:00
parent d27b7e6987
commit 63c59f054a
2 changed files with 6 additions and 0 deletions

View File

@ -182,6 +182,9 @@ gimple_outgoing_range::calc_switch_ranges (gswitch *sw)
gimple * gimple *
gimple_outgoing_range::edge_range_p (irange &r, edge e) gimple_outgoing_range::edge_range_p (irange &r, edge e)
{ {
if (single_succ_p (e->src))
return NULL;
// Determine if there is an outgoing edge. // Determine if there is an outgoing edge.
gimple *s = gimple_outgoing_range_stmt_p (e->src); gimple *s = gimple_outgoing_range_stmt_p (e->src);
if (!s) if (!s)

View File

@ -555,6 +555,9 @@ gori_map::calculate_gori (basic_block bb)
m_outgoing[bb->index] = BITMAP_ALLOC (&m_bitmaps); m_outgoing[bb->index] = BITMAP_ALLOC (&m_bitmaps);
m_incoming[bb->index] = BITMAP_ALLOC (&m_bitmaps); m_incoming[bb->index] = BITMAP_ALLOC (&m_bitmaps);
if (single_succ_p (bb))
return;
// If this block's last statement may generate range informaiton, go // If this block's last statement may generate range informaiton, go
// calculate it. // calculate it.
gimple *stmt = gimple_outgoing_range_stmt_p (bb); gimple *stmt = gimple_outgoing_range_stmt_p (bb);