From: Richard Biener Date: Thu, 10 Mar 2022 12:43:19 +0000 (+0100) Subject: tree-optimization/102943 - use tree form for sbr_sparse_bitmap X-Git-Tag: basepoints/gcc-13~721 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ee34ffa429a399f292ad1421333721a92b998772;p=thirdparty%2Fgcc.git tree-optimization/102943 - use tree form for sbr_sparse_bitmap The following arranges to remove an indirection do the bitvector in sbr_sparse_bitmap by embedding bitmap_head instead of bitmap and using the tree form (since we only ever set/query individual aligned bit chunks). That shaves off 6 seconds from 70 seconds of the slowest 521.wrf_r LRANS unit build. 2022-03-10 Richard Biener PR tree-optimization/102943 * gimple-range-cache.cc (sbr_sparse_bitmap::bitvec): Make a bitmap_head. (sbr_sparse_bitmap::sbr_sparse_bitmap): Adjust and switch to tree view. (sbr_sparse_bitmap::set_bb_range): Adjust. (sbr_sparse_bitmap::get_bb_range): Likewise. --- diff --git a/gcc/gimple-range-cache.cc b/gcc/gimple-range-cache.cc index 613135266a48..583ba29eb63c 100644 --- a/gcc/gimple-range-cache.cc +++ b/gcc/gimple-range-cache.cc @@ -313,7 +313,7 @@ private: int bitmap_get_quad (const_bitmap head, int quad); irange_allocator *m_irange_allocator; irange *m_range[SBR_NUM]; - bitmap bitvec; + bitmap_head bitvec; tree m_type; }; @@ -324,7 +324,8 @@ sbr_sparse_bitmap::sbr_sparse_bitmap (tree t, irange_allocator *allocator, { gcc_checking_assert (TYPE_P (t)); m_type = t; - bitvec = BITMAP_ALLOC (bm); + bitmap_initialize (&bitvec, bm); + bitmap_tree_view (&bitvec); m_irange_allocator = allocator; // Pre-cache varying. m_range[0] = m_irange_allocator->allocate (2); @@ -370,7 +371,7 @@ sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const irange &r) { if (r.undefined_p ()) { - bitmap_set_quad (bitvec, bb->index, SBR_UNDEF); + bitmap_set_quad (&bitvec, bb->index, SBR_UNDEF); return true; } @@ -380,11 +381,11 @@ sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const irange &r) { if (!m_range[x]) m_range[x] = m_irange_allocator->allocate (r); - bitmap_set_quad (bitvec, bb->index, x + 1); + bitmap_set_quad (&bitvec, bb->index, x + 1); return true; } // All values are taken, default to VARYING. - bitmap_set_quad (bitvec, bb->index, SBR_VARYING); + bitmap_set_quad (&bitvec, bb->index, SBR_VARYING); return false; } @@ -394,7 +395,7 @@ sbr_sparse_bitmap::set_bb_range (const_basic_block bb, const irange &r) bool sbr_sparse_bitmap::get_bb_range (irange &r, const_basic_block bb) { - int value = bitmap_get_quad (bitvec, bb->index); + int value = bitmap_get_quad (&bitvec, bb->index); if (!value) return false; @@ -412,7 +413,7 @@ sbr_sparse_bitmap::get_bb_range (irange &r, const_basic_block bb) bool sbr_sparse_bitmap::bb_range_p (const_basic_block bb) { - return (bitmap_get_quad (bitvec, bb->index) != 0); + return (bitmap_get_quad (&bitvec, bb->index) != 0); } // -------------------------------------------------------------------------