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?

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

Reply via email to