ranger: Add shortcuts for single-successor blocks

Message ID mpth7bmsol9.fsf@arm.com
State Committed
Commit 63c59f054a5cd6d356ad8bce79182ab205b7aa43
Headers
Series ranger: Add shortcuts for single-successor blocks |

Commit Message

Richard Sandiford Dec. 5, 2021, 9:56 p.m. UTC
  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

Richard Biener Dec. 6, 2021, 7:35 a.m. UTC | #1
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
>
  

Patch

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);