On Thu, 28 Sep 2023, Jakub Jelinek wrote: > Hi! > > The following patch splits the bitmap_head class into a POD > struct bitmap_head_pod and bitmap_head derived from it with non-trivial > default constexpr constructor. Most code should keep using bitmap_head > as before, bitmap_head_pod is there just for the cases where we want to > embed the bitmap head into a vector which we want to e.g. {quick,safe}_grow > and in a loop bitmap_initialize it afterwards (to avoid having to > {quick,safe}_grow_cleared them just to overwrite with bitmap_initialize). > The patch is larger than I hoped, because e.g. some code just used bitmap > and bitmap_head * or const_bitmap and const bitmap_head * interchangeably. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK if there are no comments indicating otherwise. Thanks, Richard. > 2023-09-28 Jakub Jelinek <ja...@redhat.com> > > * coretypes.h (struct bitmap_head_pod): New forward declaration. > (bitmap, const_bitmap): Replace bitmap_head with bitmap_head_pod > in typedefs. > * bitmap.h (struct bitmap_obstack): Change heads element type to > bitmap_head_pod *. > (struct bitmap_head_pod): New type. > (class bitmap_head): Changed into derived class from bitmap_head_pod > with a non-trivial constexpr default ctor. > * bitmap.cc (bitmap_head::crashme): Remove. > (bitmap_head_pod::crashme): New static data member. > (debug): Change bitmap_head to bitmap_head_pod. > (bitmap_head::dump): Renamed to ... > (bitmap_head_pod::dump): ... this. > * tree-ssa-live.h (compute_live_vars, live_vars_at_stmt, > destroy_live_vars): Change vec<bitmap_head> to vec<bitmap_head_pod>. > * tree-ssa-live.cc (struct compute_live_vars_data): Change active > member type to vec<bitmap_head_pod>. > (compute_live_vars, live_vars_at_stmt, destroy_live_vars): Change > vec<bitmap_head> to vec<bitmap_head_pod>. > * sel-sched-ir.h (forced_ebb_heads): Change type to bitmap. > * gimple-range-path.cc (path_range_query::path_range_query, > path_range_query::reset_path, path_range_query::compute_ranges): > Change const bitmap_head * in argument types to const_bitmap. > * gimple-range-path.h (path_range_query::path_range_query, > path_range_query::reset_path, path_range_query::compute_ranges): > Likewise. > (path_range_query::compute_exit_dependencies): Change bitmap_head * > in argument type to bitmap. > * tree-ssa-loop-im.cc (memory_accesses): Change type of 3 members > from vec<bitmap_head> to vec<bitmap_head_pod>. > * tree-tailcall.cc (live_vars_vec): Change type from vec<bitmap_head> > to vec<bitmap_head_pod>. > * cfganal.cc (compute_dominance_frontiers, compute_idf): Change > argument types from bitmap_head * to bitmap. > * rtl-ssa/internals.h (function_info::bb_phi_info): Change regs > member type from bitmap_head to bitmap_head_pod. > * rtl-ssa/blocks.cc (function_info::place_phis): Change frontiers > and unfiltered variable types from auto_vec<bitmap_head> to > auto_vec<bitmap_head_pod>. > * tree-ssa-pre.cc (class bitmap_set): Change expressions and values > member types from bitmap_head to bitmap_head_pod. > * tree-inline.cc (add_clobbers_to_eh_landing_pad): Change live > variable type from vec<bitmap_head> to vec<bitmap_head_pod>. > * cfganal.h (class control_dependences): Change control_dependence_map > member type from vec<bitmap_head> to vec<bitmap_head_pod>. > (compute_dominance_frontiers, compute_idf): Change argument types from > class bitmap_head * to bitmap. > > --- gcc/coretypes.h.jj 2023-08-24 15:37:28.233424065 +0200 > +++ gcc/coretypes.h 2023-09-27 14:17:00.764453202 +0200 > @@ -47,9 +47,10 @@ typedef int64_t gcov_type; > typedef uint64_t gcov_type_unsigned; > > struct bitmap_obstack; > +struct bitmap_head_pod; > class bitmap_head; > -typedef class bitmap_head *bitmap; > -typedef const class bitmap_head *const_bitmap; > +typedef class bitmap_head_pod *bitmap; > +typedef const class bitmap_head_pod *const_bitmap; > struct simple_bitmap_def; > typedef struct simple_bitmap_def *sbitmap; > typedef const struct simple_bitmap_def *const_sbitmap; > --- gcc/bitmap.h.jj 2023-04-19 09:33:59.141354388 +0200 > +++ gcc/bitmap.h 2023-09-27 15:13:45.700647295 +0200 > @@ -293,7 +293,7 @@ typedef unsigned long BITMAP_WORD; > /* Obstack for allocating bitmaps and elements from. */ > struct bitmap_obstack { > struct bitmap_element *elements; > - bitmap_head *heads; > + bitmap_head_pod *heads; > struct obstack obstack; > }; > > @@ -323,15 +323,16 @@ struct GTY((chain_next ("%h.next"))) bit > }; > > /* Head of bitmap linked list. The 'current' member points to something > - already pointed to by the chain started by first, so GTY((skip)) it. */ > + already pointed to by the chain started by first, so GTY((skip)) it. > + desc("0"), tag("0") is just to make gengtype happy, for GC there is > + no difference between bitmap_head_pod and bitmap_head types. */ > > -class GTY(()) bitmap_head { > -public: > +struct GTY((desc("0"), tag("0"))) bitmap_head_pod { > static bitmap_obstack crashme; > - /* Poison obstack to not make it not a valid initialized GC bitmap. */ > - CONSTEXPR bitmap_head() > - : indx (0), tree_form (false), padding (0), alloc_descriptor (0), first > (NULL), > - current (NULL), obstack (&crashme) > + bitmap_head_pod () = default; > + CONSTEXPR bitmap_head_pod (unsigned int n, bool t, unsigned p, unsigned a) > + : indx (n), tree_form (t), padding (p), alloc_descriptor (a), > + first (NULL), current (NULL), obstack (&crashme) > {} > /* Index of last element looked at. */ > unsigned int indx; > @@ -362,6 +363,13 @@ public: > } > }; > > +class GTY(()) bitmap_head : public bitmap_head_pod { > +public: > + /* Poison obstack to not make it not a valid initialized GC bitmap. */ > + CONSTEXPR bitmap_head() : bitmap_head_pod (0, false, 0, 0) > + {} > +}; > + > /* Global data */ > extern bitmap_element bitmap_zero_bits; /* Zero bitmap element */ > extern bitmap_obstack bitmap_default_obstack; /* Default bitmap obstack */ > --- gcc/bitmap.cc.jj 2023-04-19 09:33:59.141354388 +0200 > +++ gcc/bitmap.cc 2023-09-27 19:48:33.347080275 +0200 > @@ -28,7 +28,7 @@ mem_alloc_description<bitmap_usage> bitm > > /* Static zero-initialized bitmap obstack used for default initialization > of bitmap_head. */ > -bitmap_obstack bitmap_head::crashme; > +bitmap_obstack bitmap_head_pod::crashme; > > static bitmap_element *bitmap_tree_listify_from (bitmap, bitmap_element *); > > @@ -2849,13 +2849,13 @@ dump_bitmap_statistics (void) > } > > DEBUG_FUNCTION void > -debug (const bitmap_head &ref) > +debug (const bitmap_head_pod &ref) > { > dump_bitmap (stderr, &ref); > } > > DEBUG_FUNCTION void > -debug (const bitmap_head *ptr) > +debug (const bitmap_head_pod *ptr) > { > if (ptr) > debug (*ptr); > @@ -2866,17 +2866,17 @@ debug (const bitmap_head *ptr) > DEBUG_FUNCTION void > debug (const auto_bitmap &ref) > { > - debug ((const bitmap_head &) ref); > + debug ((const bitmap_head_pod &) ref); > } > > DEBUG_FUNCTION void > debug (const auto_bitmap *ptr) > { > - debug ((const bitmap_head *) ptr); > + debug ((const bitmap_head_pod *) ptr); > } > > void > -bitmap_head::dump () > +bitmap_head_pod::dump () > { > debug (this); > } > --- gcc/tree-ssa-live.h.jj 2023-09-06 17:28:39.333779470 +0200 > +++ gcc/tree-ssa-live.h 2023-09-27 19:45:07.104895327 +0200 > @@ -271,10 +271,11 @@ extern void debug (tree_live_info_d *ptr > extern void dump_live_info (FILE *, tree_live_info_p, int); > > typedef hash_map<int_hash <unsigned int, -1U>, unsigned int> live_vars_map; > -extern vec<bitmap_head> compute_live_vars (struct function *, live_vars_map > *); > -extern bitmap live_vars_at_stmt (vec<bitmap_head> &, live_vars_map *, > +extern vec<bitmap_head_pod> compute_live_vars (struct function *, > + live_vars_map *); > +extern bitmap live_vars_at_stmt (vec<bitmap_head_pod> &, live_vars_map *, > gimple *); > -extern void destroy_live_vars (vec<bitmap_head> &); > +extern void destroy_live_vars (vec<bitmap_head_pod> &); > > /* Return TRUE if P is marked as a global in LIVE. */ > > --- gcc/tree-ssa-live.cc.jj 2023-09-06 17:28:39.333779470 +0200 > +++ gcc/tree-ssa-live.cc 2023-09-27 19:44:44.875198746 +0200 > @@ -1281,7 +1281,7 @@ struct compute_live_vars_data { > /* Vector of bitmaps for live vars indices at the end of basic blocks, > indexed by bb->index. ACTIVE[ENTRY_BLOCK] must be empty bitmap, > ACTIVE[EXIT_BLOCK] is used for STOP_AFTER. */ > - vec<bitmap_head> active; > + vec<bitmap_head_pod> active; > /* Work bitmap of currently live variables. */ > bitmap work; > /* Set of interesting variables. Variables with uids not in this > @@ -1345,10 +1345,10 @@ compute_live_vars_1 (basic_block bb, com > indexes of automatic variables VARS, compute which of those variables are > (might be) live at the end of each basic block. */ > > -vec<bitmap_head> > +vec<bitmap_head_pod> > compute_live_vars (struct function *fn, live_vars_map *vars) > { > - vec<bitmap_head> active; > + vec<bitmap_head_pod> active; > > /* We approximate the live range of a stack variable by taking the first > mention of its name as starting point(s), and by the end-of-scope > @@ -1395,7 +1395,7 @@ compute_live_vars (struct function *fn, > live after the STOP_AFTER statement and return that bitmap. */ > > bitmap > -live_vars_at_stmt (vec<bitmap_head> &active, live_vars_map *vars, > +live_vars_at_stmt (vec<bitmap_head_pod> &active, live_vars_map *vars, > gimple *stop_after) > { > bitmap work = BITMAP_ALLOC (NULL); > @@ -1408,7 +1408,7 @@ live_vars_at_stmt (vec<bitmap_head> &act > /* Destroy what compute_live_vars has returned when it is no longer needed. > */ > > void > -destroy_live_vars (vec<bitmap_head> &active) > +destroy_live_vars (vec<bitmap_head_pod> &active) > { > unsigned len = active.length (); > for (unsigned i = 0; i < len; i++) > --- gcc/sel-sched-ir.h.jj 2023-02-28 11:29:22.291806607 +0100 > +++ gcc/sel-sched-ir.h 2023-09-27 15:30:48.280695816 +0200 > @@ -951,7 +951,7 @@ extern vec<sel_region_bb_info_def> sel_r > #define BB_AV_SET_VALID_P(BB) (BB_AV_LEVEL (BB) == global_level) > > /* Used in bb_in_ebb_p. */ > -extern bitmap_head *forced_ebb_heads; > +extern bitmap forced_ebb_heads; > > /* The loop nest being pipelined. */ > extern class loop *current_loop_nest; > --- gcc/gimple-range-path.cc.jj 2023-04-27 10:17:45.874494495 +0200 > +++ gcc/gimple-range-path.cc 2023-09-27 15:27:16.326603893 +0200 > @@ -38,7 +38,7 @@ along with GCC; see the file COPYING3. > > path_range_query::path_range_query (gimple_ranger &ranger, > const vec<basic_block> &path, > - const bitmap_head *dependencies, > + const_bitmap dependencies, > bool resolve) > : m_cache (), > m_ranger (ranger), > @@ -192,7 +192,7 @@ path_range_query::unreachable_path_p () > > void > path_range_query::reset_path (const vec<basic_block> &path, > - const bitmap_head *dependencies) > + const_bitmap dependencies) > { > gcc_checking_assert (path.length () > 1); > m_path = path.copy (); > @@ -549,7 +549,7 @@ path_range_query::compute_exit_dependenc > // calculated from the final conditional in the path. > > void > -path_range_query::compute_ranges (const bitmap_head *dependencies) > +path_range_query::compute_ranges (const_bitmap dependencies) > { > if (DEBUG_SOLVER) > fprintf (dump_file, > "\n==============================================\n"); > --- gcc/gimple-range-path.h.jj 2023-04-27 10:17:45.874494495 +0200 > +++ gcc/gimple-range-path.h 2023-09-27 15:26:52.980924197 +0200 > @@ -34,11 +34,11 @@ class path_range_query : public range_qu > public: > path_range_query (class gimple_ranger &ranger, > const vec<basic_block> &path, > - const bitmap_head *dependencies = NULL, > + const_bitmap dependencies = NULL, > bool resolve = true); > path_range_query (gimple_ranger &ranger, bool resolve = true); > virtual ~path_range_query (); > - void reset_path (const vec<basic_block> &, const bitmap_head > *dependencies); > + void reset_path (const vec<basic_block> &, const_bitmap dependencies); > bool range_of_expr (vrange &r, tree name, gimple * = NULL) override; > bool range_of_stmt (vrange &r, gimple *, tree name = NULL) override; > bool unreachable_path_p (); > @@ -47,8 +47,8 @@ public: > > private: > bool internal_range_of_expr (vrange &r, tree name, gimple *); > - void compute_ranges (const bitmap_head *dependencies); > - void compute_exit_dependencies (bitmap_head *dependencies); > + void compute_ranges (const_bitmap dependencies); > + void compute_exit_dependencies (bitmap dependencies); > bool defined_outside_path (tree name); > void range_on_path_entry (vrange &r, tree name); > path_oracle *get_path_oracle () { return (path_oracle *)m_oracle; } > --- gcc/tree-ssa-loop-im.cc.jj 2023-09-27 13:40:52.034332877 +0200 > +++ gcc/tree-ssa-loop-im.cc 2023-09-27 14:21:18.486901776 +0200 > @@ -241,13 +241,13 @@ static struct > vec<im_mem_ref *> refs_list; > > /* The set of memory references accessed in each loop. */ > - vec<bitmap_head> refs_loaded_in_loop; > + vec<bitmap_head_pod> refs_loaded_in_loop; > > /* The set of memory references stored in each loop. */ > - vec<bitmap_head> refs_stored_in_loop; > + vec<bitmap_head_pod> refs_stored_in_loop; > > /* The set of memory references stored in each loop, including subloops . > */ > - vec<bitmap_head> all_refs_stored_in_loop; > + vec<bitmap_head_pod> all_refs_stored_in_loop; > > /* Cache for expanding memory addresses. */ > hash_map<tree, name_expansion *> *ttae_cache; > --- gcc/tree-tailcall.cc.jj 2023-04-24 10:35:04.913938226 +0200 > +++ gcc/tree-tailcall.cc 2023-09-27 19:47:11.487197594 +0200 > @@ -405,7 +405,7 @@ propagate_through_phis (tree var, edge e > /* Argument for compute_live_vars/live_vars_at_stmt and what > compute_live_vars > returns. Computed lazily, but just once for the function. */ > static live_vars_map *live_vars; > -static vec<bitmap_head> live_vars_vec; > +static vec<bitmap_head_pod> live_vars_vec; > > /* Finds tailcalls falling into basic block BB. The list of found tailcalls > is > added to the start of RET. */ > --- gcc/cfganal.cc.jj 2023-04-22 10:23:40.461614962 +0200 > +++ gcc/cfganal.cc 2023-09-27 15:29:14.280985521 +0200 > @@ -1636,7 +1636,7 @@ dfs_enumerate_from (basic_block bb, int > */ > > void > -compute_dominance_frontiers (bitmap_head *frontiers) > +compute_dominance_frontiers (bitmap frontiers) > { > timevar_push (TV_DOM_FRONTIERS); > > @@ -1677,7 +1677,7 @@ compute_dominance_frontiers (bitmap_head > allocated for the return value. */ > > bitmap > -compute_idf (bitmap def_blocks, bitmap_head *dfs) > +compute_idf (bitmap def_blocks, bitmap dfs) > { > bitmap_iterator bi; > unsigned bb_index, i; > --- gcc/rtl-ssa/internals.h.jj 2023-01-16 11:52:16.250731603 +0100 > +++ gcc/rtl-ssa/internals.h 2023-09-27 14:24:21.961373493 +0200 > @@ -25,7 +25,7 @@ class function_info::bb_phi_info > { > public: > // The set of registers that need phi nodes. > - bitmap_head regs; > + bitmap_head_pod regs; > > // The number of registers in REGS. > unsigned int num_phis; > --- gcc/rtl-ssa/blocks.cc.jj 2023-01-16 11:52:16.249731618 +0100 > +++ gcc/rtl-ssa/blocks.cc 2023-09-27 14:25:08.113737510 +0200 > @@ -613,7 +613,7 @@ function_info::place_phis (build_info &b > unsigned int num_bb_indices = last_basic_block_for_fn (m_fn); > > // Calculate dominance frontiers. > - auto_vec<bitmap_head> frontiers; > + auto_vec<bitmap_head_pod> frontiers; > frontiers.safe_grow (num_bb_indices); > for (unsigned int i = 0; i < num_bb_indices; ++i) > bitmap_initialize (&frontiers[i], &bitmap_default_obstack); > @@ -625,7 +625,7 @@ function_info::place_phis (build_info &b > // PENDING as a staging area: registers in PENDING need phi nodes if > // they are live on entry to the corresponding block, but do not need > // phi nodes otherwise. > - auto_vec<bitmap_head> unfiltered; > + auto_vec<bitmap_head_pod> unfiltered; > unfiltered.safe_grow (num_bb_indices); > for (unsigned int i = 0; i < num_bb_indices; ++i) > bitmap_initialize (&unfiltered[i], &bitmap_default_obstack); > --- gcc/tree-ssa-pre.cc.jj 2023-08-18 09:33:45.935664082 +0200 > +++ gcc/tree-ssa-pre.cc 2023-09-27 19:46:23.099858050 +0200 > @@ -484,8 +484,8 @@ get_or_alloc_expr_for_reference (vn_refe > typedef class bitmap_set > { > public: > - bitmap_head expressions; > - bitmap_head values; > + bitmap_head_pod expressions; > + bitmap_head_pod values; > } *bitmap_set_t; > > #define FOR_EACH_EXPR_ID_IN_SET(set, id, bi) \ > --- gcc/tree-inline.cc.jj 2023-08-28 10:33:11.782178374 +0200 > +++ gcc/tree-inline.cc 2023-09-27 19:47:40.719798594 +0200 > @@ -2475,7 +2475,7 @@ add_clobbers_to_eh_landing_pad (copy_bod > if (vars == NULL) > return; > > - vec<bitmap_head> live = compute_live_vars (id->src_cfun, vars); > + vec<bitmap_head_pod> live = compute_live_vars (id->src_cfun, vars); > FOR_EACH_VEC_SAFE_ELT (id->src_cfun->local_decls, i, var) > if (VAR_P (var)) > { > --- gcc/cfganal.h.jj 2023-04-22 10:23:40.472614801 +0200 > +++ gcc/cfganal.h 2023-09-27 15:29:39.712636592 +0200 > @@ -44,7 +44,7 @@ private: > void set_control_dependence_map_bit (basic_block, int); > void clear_control_dependence_bitmap (basic_block); > void find_control_dependence (int); > - vec<bitmap_head> control_dependence_map; > + vec<bitmap_head_pod> control_dependence_map; > vec<std::pair<int, int> > m_el; > bitmap_obstack m_bitmaps; > }; > @@ -77,8 +77,8 @@ extern int rev_post_order_and_mark_dfs_b > extern int dfs_enumerate_from (basic_block, int, > bool (*)(const_basic_block, const void *), > basic_block *, int, const void *); > -extern void compute_dominance_frontiers (class bitmap_head *); > -extern bitmap compute_idf (bitmap, class bitmap_head *); > +extern void compute_dominance_frontiers (bitmap); > +extern bitmap compute_idf (bitmap, bitmap); > extern void bitmap_intersection_of_succs (sbitmap, sbitmap *, basic_block); > extern void bitmap_intersection_of_preds (sbitmap, sbitmap *, basic_block); > extern void bitmap_union_of_succs (sbitmap, sbitmap *, basic_block); > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)