ranger: Add shortcuts for single-successor blocks
Commit Message
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.
Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
Richard
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.
---
gcc/gimple-range-edge.cc | 3 +++
gcc/gimple-range-gori.cc | 3 +++
2 files changed, 6 insertions(+)
Comments
On Sun, Dec 5, 2021 at 10:58 PM Richard Sandiford via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> 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.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
OK.
Richard.
> Richard
>
>
> 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.
> ---
> gcc/gimple-range-edge.cc | 3 +++
> gcc/gimple-range-gori.cc | 3 +++
> 2 files changed, 6 insertions(+)
>
> diff --git a/gcc/gimple-range-edge.cc b/gcc/gimple-range-edge.cc
> index afffc8dbcae..9e805230004 100644
> --- a/gcc/gimple-range-edge.cc
> +++ b/gcc/gimple-range-edge.cc
> @@ -182,6 +182,9 @@ gimple_outgoing_range::calc_switch_ranges (gswitch *sw)
> gimple *
> 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.
> gimple *s = gimple_outgoing_range_stmt_p (e->src);
> if (!s)
> diff --git a/gcc/gimple-range-gori.cc b/gcc/gimple-range-gori.cc
> index 0dba34b58c5..b256e4afd15 100644
> --- a/gcc/gimple-range-gori.cc
> +++ b/gcc/gimple-range-gori.cc
> @@ -555,6 +555,9 @@ gori_map::calculate_gori (basic_block bb)
> m_outgoing[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
> // calculate it.
> gimple *stmt = gimple_outgoing_range_stmt_p (bb);
> --
> 2.31.1
>
@@ -182,6 +182,9 @@ gimple_outgoing_range::calc_switch_ranges (gswitch *sw)
gimple *
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.
gimple *s = gimple_outgoing_range_stmt_p (e->src);
if (!s)
@@ -555,6 +555,9 @@ gori_map::calculate_gori (basic_block bb)
m_outgoing[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
// calculate it.
gimple *stmt = gimple_outgoing_range_stmt_p (bb);