https://gcc.gnu.org/g:0511f9115de32818c4b75a8e73b2a667bd766688

commit r17-5680-g0511f9115de32818c4b75a8e73b2a667bd766688
Author: Andrew MacLeod <[email protected]>
Date:   Wed Oct 7 16:06:58 2026 -0400

    Move ptr_info_def pointer into prange_storage
    
    Move the ptr_info_def pointer from the tree union into a prange_storage.
    This allows a full prange to be stored in an SSA_NAME rather than
    just the non-null attribute.
    
            * ipa-icf.cc (sem_item_optimizer::merge_classes): Do not special
            case pointer ranges.
            * print-tree.cc (print_node): Print all range addresses, not
            just pointers.
            * tree-core.h (union ssa_name_info_type): Remove.
            * tree-ssanames.cc (range_info_alloc): Change return type.
            (ssa_name_ptr_info): New.
            (range_info_set_range): Preserve ptr_info_def pointer.
            (make_ssa_name_fn): Do not special case pointers.
            (set_ssa_name_ptr_info): New.
            (get_ptr_info): Use set_ssa_name_ptr_info.
            (duplicate_ssa_name_ptr_info): Likewise.
            * tree-ssanames.h (ssa_name_ptr_info): Add prototype.
            (SSA_NAME_PTR_INFO): Relocate from tree.h and adjust.
            * tree.h (SSA_NAME_PTR_INFO): Move to tree-ssanames.h.
            (SSA_NAME_RANGE_INFO): Adjust.
            * value-range-storage.cc (prange_storage::prange_storage): Set
            ptr_info field.
            * value-range-storage.h (prange_storage::ptr_info): New member.

Diff:
---
 gcc/ipa-icf.cc             | 12 ++---------
 gcc/print-tree.cc          |  6 +++---
 gcc/tree-core.h            | 12 ++++-------
 gcc/tree-ssanames.cc       | 51 ++++++++++++++++++++++++++++++++++++++--------
 gcc/tree-ssanames.h        |  3 +++
 gcc/tree.h                 | 10 +++------
 gcc/value-range-storage.cc |  4 ++++
 gcc/value-range-storage.h  |  7 +++----
 8 files changed, 65 insertions(+), 40 deletions(-)

diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc
index 7aa2554f8a74..c421f676b27c 100644
--- a/gcc/ipa-icf.cc
+++ b/gcc/ipa-icf.cc
@@ -3504,19 +3504,11 @@ sem_item_optimizer::merge_classes (unsigned int 
prev_class_count,
            tree name;
            FOR_EACH_SSA_NAME (i, name, DECL_STRUCT_FUNCTION (source->decl))
              {
-               /* We need to either merge or reset SSA_NAME_*_INFO.
+               /* We need to either merge or reset SSA_NAME_RANGE_INFO.
                   For merging we don't preserve the mapping between
                   original and alias SSA_NAMEs from successful equals
                   calls.  */
-               if (POINTER_TYPE_P (TREE_TYPE (name)))
-                 {
-                   if (SSA_NAME_PTR_INFO (name))
-                     {
-                       gcc_checking_assert (!flag_wpa);
-                       SSA_NAME_PTR_INFO (name) = NULL;
-                     }
-                 }
-               else if (SSA_NAME_RANGE_INFO (name))
+               if (SSA_NAME_RANGE_INFO (name))
                  {
                    gcc_checking_assert (!flag_wpa);
                    SSA_NAME_RANGE_INFO (name) = NULL;
diff --git a/gcc/print-tree.cc b/gcc/print-tree.cc
index d48f42d635fb..379e0081ba50 100644
--- a/gcc/print-tree.cc
+++ b/gcc/print-tree.cc
@@ -976,11 +976,11 @@ print_node (FILE *file, const char *prefix, tree node, 
int indent,
          if (SSA_NAME_IN_FREE_LIST (node))
            fprintf (file, " in-free-list");
 
-         if (SSA_NAME_PTR_INFO (node))
+         /* Print the storage address for any range-info.  */
+         if (SSA_NAME_RANGE_INFO (node))
            {
              indent_to (file, indent + 3);
-             if (SSA_NAME_PTR_INFO (node))
-               dump_addr (file, " ptr-info ", SSA_NAME_PTR_INFO (node));
+             dump_addr (file, " range-info ", SSA_NAME_RANGE_INFO (node));
            }
          break;
 
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index c252cd28bf67..80d0540c7632 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1737,14 +1737,10 @@ struct GTY(()) tree_ssa_name {
   /* Statement that defines this SSA name.  */
   gimple *def_stmt;
 
-  /* Value range information.  */
-  union ssa_name_info_type {
-    /* Range and aliasing info for pointers.  */
-    struct GTY ((tag ("0"))) ptr_info_def *ptr_info;
-    /* Range info for everything else.  */
-    struct GTY ((tag ("1"))) vrange_storage * range_info;
-  } GTY ((desc ("%1.typed.type ?" \
-               "!POINTER_TYPE_P (TREE_TYPE ((tree)&%1)) : 2"))) info;
+  /* Value range information for every type of SSA name.
+     The aliasing information for a prange is stored in prange_storage.
+     See SSA_NAME_PTR_INFO in tree-ssanames.h.  */
+  struct GTY (()) vrange_storage *range_info;
   /* Immediate uses list for this SSA_NAME.  */
   struct ssa_use_operand_t imm_uses;
 #if defined ENABLE_GIMPLE_CHECKING
diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
index 8eac57f42cba..01ba0573efe8 100644
--- a/gcc/tree-ssanames.cc
+++ b/gcc/tree-ssanames.cc
@@ -94,7 +94,7 @@ range_info_fits_p (tree name, const vrange &r)
 /* Allocate a new global range for NAME and set it to R.  Return the
    allocation slot.  */
 
-inline void *
+inline vrange_storage *
 range_info_alloc (tree name, const vrange &r)
 {
   vrange_storage *mem = ggc_alloc_vrange_storage (r);
@@ -111,6 +111,18 @@ range_info_free (tree name)
   ggc_free (mem);
 }
 
+/* Return the aliasing information for ssa-name NAME, or NULL if there
+   is none.  Return NULL for non pointer types.  */
+
+struct ptr_info_def *
+ssa_name_ptr_info (const_tree name)
+{
+  vrange_storage *mem = SSA_NAME_RANGE_INFO (name);
+  if (!mem || mem->m_discriminator != VR_PRANGE)
+    return NULL;
+  return static_cast <prange_storage *> (mem)->ptr_info;
+}
+
 /* Return the global range for NAME in R.  */
 
 inline void
@@ -127,10 +139,20 @@ range_info_set_range (tree name, const vrange &r)
 {
   if (!range_info_p (name) || !range_info_fits_p (name, r))
     {
+      // Aliasing info belongs to NAME, not to the prange storage object which
+      // might get reallocated.  ptr_info_def addresses may be cached
+      // elsewhere, so save and copy it back after any reallocation.
+      ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
       if (range_info_p (name))
        range_info_free (name);
 
-      return range_info_alloc (name, r);
+      vrange_storage *mem = range_info_alloc (name, r);
+      if (pi && mem)
+       {
+         gcc_checking_assert (mem->m_discriminator == VR_PRANGE);
+         static_cast <prange_storage *> (mem)->ptr_info = pi;
+       }
+      return mem != NULL;
     }
   else
     {
@@ -398,10 +420,7 @@ make_ssa_name_fn (struct function *fn, tree var, gimple 
*stmt,
       SET_SSA_NAME_VAR_OR_IDENTIFIER (t, var);
     }
   SSA_NAME_DEF_STMT (t) = stmt;
-  if (POINTER_TYPE_P (TREE_TYPE (t)))
-    SSA_NAME_PTR_INFO (t) = NULL;
-  else
-    SSA_NAME_RANGE_INFO (t) = NULL;
+  SSA_NAME_RANGE_INFO (t) = NULL;
 
   SSA_NAME_IN_FREE_LIST (t) = 0;
   SSA_NAME_IS_DEFAULT_DEF (t) = 0;
@@ -787,6 +806,22 @@ adjust_ptr_info_misalignment (struct ptr_info_def *pi, 
poly_uint64 increment)
     }
 }
 
+/* Make PI the aliasing information for NAME.  Allocate a VARYING range if
+   NAME does not already have a range.  */
+
+static void
+set_ssa_name_ptr_info (tree name, struct ptr_info_def *pi)
+{
+  gcc_checking_assert (POINTER_TYPE_P (TREE_TYPE (name)));
+
+  if (!range_info_p (name))
+    SSA_NAME_RANGE_INFO (name) = ggc_alloc_vrange_storage (TREE_TYPE (name));
+
+  vrange_storage *mem = SSA_NAME_RANGE_INFO (name);
+  gcc_checking_assert (mem && mem->m_discriminator == VR_PRANGE);
+  static_cast <prange_storage *> (mem)->ptr_info = pi;
+}
+
 /* Return the alias information associated with pointer T.  It creates a
    new instance if none existed.  */
 
@@ -803,7 +838,7 @@ get_ptr_info (tree t)
       pi = ggc_cleared_alloc<ptr_info_def> ();
       pt_solution_reset (&pi->pt);
       mark_ptr_info_alignment_unknown (pi);
-      SSA_NAME_PTR_INFO (t) = pi;
+      set_ssa_name_ptr_info (t, pi);
     }
 
   return pi;
@@ -847,7 +882,7 @@ duplicate_ssa_name_ptr_info (tree name, struct ptr_info_def 
*ptr_info)
   new_ptr_info = ggc_alloc<ptr_info_def> ();
   *new_ptr_info = *ptr_info;
 
-  SSA_NAME_PTR_INFO (name) = new_ptr_info;
+  set_ssa_name_ptr_info (name, new_ptr_info);
 }
 
 void
diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h
index a7b564dd4e97..ea38a3bc3c52 100644
--- a/gcc/tree-ssanames.h
+++ b/gcc/tree-ssanames.h
@@ -45,6 +45,9 @@ struct GTY(()) ptr_info_def
   unsigned int misalign;
 };
 
+/* Aliasing attributes for SSA_NAMEs for pointer-type variables.  */
+struct ptr_info_def *ssa_name_ptr_info (const_tree name);
+#define SSA_NAME_PTR_INFO(N) (ssa_name_ptr_info (N))
 
 #define SSANAMES(fun) (fun)->gimple_df->ssa_names
 #define DEFAULT_DEFS(fun) (fun)->gimple_df->default_defs
diff --git a/gcc/tree.h b/gcc/tree.h
index fb82b1750ddc..73c7d25a22c0 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -2322,13 +2322,9 @@ class auto_suppress_location_wrappers
 #define SSA_NAME_POINTS_TO_READONLY_MEMORY(NODE) \
     SSA_NAME_CHECK (NODE)->base.deprecated_flag
 
-/* Attributes for SSA_NAMEs for pointer-type variables.  */
-#define SSA_NAME_PTR_INFO(N) \
-   SSA_NAME_CHECK (N)->ssa_name.info.ptr_info
-
-/* Value range info attributes for SSA_NAMEs of non pointer-type variables.  */
-#define SSA_NAME_RANGE_INFO(N) \
-    SSA_NAME_CHECK (N)->ssa_name.info.range_info
+/* Value range info for an SSA_NAME, of any type.  */
+#define SSA_NAME_RANGE_INFO(N)  \
+    SSA_NAME_CHECK (N)->ssa_name.range_info
 
 /* Return the immediate_use information for an SSA_NAME. */
 #define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses
diff --git a/gcc/value-range-storage.cc b/gcc/value-range-storage.cc
index 08c85a8880b5..b121ffac7543 100644
--- a/gcc/value-range-storage.cc
+++ b/gcc/value-range-storage.cc
@@ -638,6 +638,10 @@ prange_storage::alloc (vrange_internal_alloc &allocator, 
const prange &r,
 
 prange_storage::prange_storage (const prange &r) : vrange_storage (VR_PRANGE)
 {
+  // Aliasing info is not part of the range, so it is never copied from one.
+  // Only set_ssa_name_ptr_info() in tree-ssanames.cc ever makes this non-null.
+  ptr_info = NULL;
+
   unsigned num_words;
   enum prange_kind kind = prange_format (r, num_words);
   unsigned short prec = (kind == PR_UNDEFINED) ? 0 : TYPE_PRECISION (r.type 
());
diff --git a/gcc/value-range-storage.h b/gcc/value-range-storage.h
index 6c2838eecc82..9eb03fc8e736 100644
--- a/gcc/value-range-storage.h
+++ b/gcc/value-range-storage.h
@@ -41,10 +41,6 @@ private:
 };
 
 // Efficient memory storage for a vrange.
-//
-// The GTY marker here does nothing but get gengtype to generate the
-// ggc_test_and_set_mark calls.  We ignore the derived classes, since
-// they don't contain any pointers.
 
 class GTY((desc ("%h.m_discriminator"), tag("VR_UNKNOWN"))) vrange_storage
 {
@@ -130,6 +126,9 @@ public:
   bool fits_p (const prange &r) const;
   void dump () const;
 
+  // Pointer aliasing information.  Managed seperately via SSA_NAME_PTR_INFO.
+  struct ptr_info_def *ptr_info;
+
 private:
   DISABLE_COPY_AND_ASSIGN (prange_storage);
   prange_storage (const prange &r);

Reply via email to