[This is a patch series to improve the back threader performance. With
it the threader is 12% faster.]
The backwards threader marks blocks visited while walking a candidate
path with a hash_set<basic_block>, which costs a hash lookup on both
entry to and exit from every node. The set is only ever used to test
membership of a block of the current function, and the CFG does not
change during the search, so a sbitmap indexed by bb->index is
cleaner.
The function find_paths_to_names clears the bit it set on every exit
path so the per-block reset in maybe_thread_block is redundant.
Measured in perf instructions retired over our stage1 .ii corpus, this
drops back_threader::thread_blocks() by 2.2% (pass_thread_jumps 2.4%,
pass_thread_jumps_full 1.1%, pass_early_thread_jumps 2.2%) and the
whole compile by 0.02% over 806 TUs.
Tested on ppc64le Linux. The assembly is identical over the .ii
files, so this is a NFC.
OK?
gcc/ChangeLog:
* tree-ssa-threadbackward.cc (back_threader::m_visited_bbs):
Turn into an sbitmap.
(back_threader::back_threader): Allocate it.
(back_threader::~back_threader): Free it.
(back_threader::find_paths_to_names): Adjust.
(back_threader::maybe_thread_block): Drop the reset.
---
gcc/tree-ssa-threadbackward.cc | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/gcc/tree-ssa-threadbackward.cc b/gcc/tree-ssa-threadbackward.cc
index 20bb74c507f..90691ea9612 100644
--- a/gcc/tree-ssa-threadbackward.cc
+++ b/gcc/tree-ssa-threadbackward.cc
@@ -120,8 +120,8 @@ private:
// Current path being analyzed.
auto_vec<basic_block> m_path;
- // Hash to mark visited BBs while analyzing a path.
- hash_set<basic_block> m_visited_bbs;
+ // Bitmap to mark visited BBs while analyzing a path.
+ sbitmap m_visited_bbs;
// The set of SSA names, any of which could potentially change the
// value of the final conditional in a path.
auto_bitmap m_imports;
@@ -163,10 +163,13 @@ back_threader::back_threader (function *fun, unsigned
flags, bool first)
mark_dfs_back_edges ();
m_ranger = new gimple_ranger;
+ m_visited_bbs = sbitmap_alloc (last_basic_block_for_fn (fun));
+ bitmap_clear (m_visited_bbs);
}
back_threader::~back_threader ()
{
+ sbitmap_free (m_visited_bbs);
delete m_ranger;
loop_optimizer_finalize ();
}
@@ -383,7 +386,7 @@ back_threader::find_paths_to_names (basic_block bb, bitmap
interesting,
unsigned overall_paths,
back_threader_profitability &profit)
{
- if (m_visited_bbs.add (bb))
+ if (!bitmap_set_bit (m_visited_bbs, bb->index))
return;
m_path.safe_push (bb);
@@ -524,7 +527,7 @@ back_threader::find_paths_to_names (basic_block bb, bitmap
interesting,
// Reset things to their original state.
m_path.pop ();
- m_visited_bbs.remove (bb);
+ bitmap_clear_bit (m_visited_bbs, bb->index);
}
// Search backwards from BB looking for paths where the final
@@ -548,7 +551,6 @@ back_threader::maybe_thread_block (basic_block bb)
return;
m_last_stmt = stmt;
- m_visited_bbs.empty ();
m_path.truncate (0);
// We compute imports of the path during discovery starting
--
2.53.0