The following 4 patch build on the previous set which promoted prange
into the ssa-name, and move the ptr_info_align structure into a
prange_storage.
Lets have a look and get some comments before I go any further.
This patch changes the API calls related to the alignment fields to take
an SSA_NAME instead of a ptr_info_def * pointer. Its relatively
mechanical, and there was one function (adjust_ptr_info_misalignment)
Which wasn't even used, so I removed it.
Bootstrapped on x86_64-pc-linux-gnu with no regressions.
Andrew
From 3d393845c42c490019d242e346da68a0948da550 Mon Sep 17 00:00:00 2001
From: Andrew MacLeod <[email protected]>
Date: Wed, 21 Oct 2026 20:51:59 -0400
Subject: [PATCH 5/9] Adjust ptr_info_align API to take an ssa name
All ptr_info_align queries require geting the ptr_info_def structure
from a prange_storage, then using that as the paramater in the rotuines.
This changes the API to take the name directly, avoiding the
get_ptr_info() call, and simplifying removal of the alignment fields in
a later patch as all references to the ptr_info_)def structure are
removed from the client calls.
Assisted-by: Claude Opus 5
* builtins.cc (get_pointer_alignment_1): Adjust call to new API.
* gimple-low.cc (lower_builtin_assume_aligned): Likewise.
* gimple-pretty-print.cc (dump_ssaname_info): Likewise.
* ipa-prop.cc (ipcp_update_vr): Likewise.
* tree-ssa-ccp.cc (ccp_finalize): Likewise.
* tree-ssa-dom.cc (maybe_set_nonzero_bits): Likewise.
* tree-ssa-loop-ivopts.cc (rewrite_use_nonlinear_expr): Likewise.
* tree-ssa-loop-prefetch.cc (issue_prefetch_ref): Likewise.
* tree-ssa-pre.cc (create_expression_by_pieces): Likewise.
* tree-ssanames.cc (get_nonzero_bits_1): Likewise.
(get_ptr_info_alignment): Adjust parameter.
(mark_ptr_info_alignment_unknown): Likewise.
(set_ptr_info_alignment): Likewise.
(adjust_ptr_info_misalignment): Remove.
(get_ptr_info): Use new API.
(reset_flow_sensitive_info): Likewise.
(flow_sensitive_info_storage::save): Likewise.
(flow_sensitive_info_storage::restore): Likewise.
* tree-ssanames.h (get_ptr_info_alignment): Adjust prototype.
(mark_ptr_info_alignment_unknown): Likewise.
(set_ptr_info_alignment): Likewise.
(adjust_ptr_info_misalignment): Remove prototype.
* tree-vect-data-refs.cc (vect_duplicate_ssa_name_ptr_info): Adjust
to new API.
* tree-vect-stmts.cc (create_array_ref): Likewise.
(vectorizable_store): Likewise.
(vectorizable_load): Likewise.
---
gcc/builtins.cc | 3 +-
gcc/gimple-low.cc | 3 +-
gcc/gimple-pretty-print.cc | 2 +-
gcc/ipa-prop.cc | 8 ++--
gcc/tree-ssa-ccp.cc | 2 +-
gcc/tree-ssa-dom.cc | 9 ++--
gcc/tree-ssa-loop-ivopts.cc | 3 +-
gcc/tree-ssa-loop-prefetch.cc | 3 +-
gcc/tree-ssa-pre.cc | 3 +-
gcc/tree-ssanames.cc | 82 +++++++++++++++--------------------
gcc/tree-ssanames.h | 15 +++----
gcc/tree-vect-data-refs.cc | 2 +-
gcc/tree-vect-stmts.cc | 7 ++-
13 files changed, 62 insertions(+), 80 deletions(-)
diff --git a/gcc/builtins.cc b/gcc/builtins.cc
index 3127e0e82a1..9a8e499ddb1 100644
--- a/gcc/builtins.cc
+++ b/gcc/builtins.cc
@@ -454,9 +454,8 @@ get_pointer_alignment_1 (tree exp, unsigned int *alignp,
&& POINTER_TYPE_P (TREE_TYPE (exp)))
{
unsigned int ptr_align, ptr_misalign;
- struct ptr_info_def *pi = SSA_NAME_PTR_INFO (exp);
- if (pi && get_ptr_info_alignment (pi, &ptr_align, &ptr_misalign))
+ if (get_ptr_info_alignment (exp, &ptr_align, &ptr_misalign))
{
*bitposp = ptr_misalign * BITS_PER_UNIT;
*alignp = ptr_align * BITS_PER_UNIT;
diff --git a/gcc/gimple-low.cc b/gcc/gimple-low.cc
index ed752429854..e39562ca9d1 100644
--- a/gcc/gimple-low.cc
+++ b/gcc/gimple-low.cc
@@ -1431,8 +1431,7 @@ lower_builtin_assume_aligned (gimple_stmt_iterator *gsi)
/* For lowering we simply transfer alignment information to the
result and leave the call otherwise unchanged, it will be elided
at RTL expansion time. */
- ptr_info_def *pi = get_ptr_info (lhs);
- set_ptr_info_alignment (pi, aligni, misaligni);
+ set_ptr_info_alignment (lhs, aligni, misaligni);
}
diff --git a/gcc/gimple-pretty-print.cc b/gcc/gimple-pretty-print.cc
index ecbd02c92da..ae7fdb2d752 100644
--- a/gcc/gimple-pretty-print.cc
+++ b/gcc/gimple-pretty-print.cc
@@ -2408,7 +2408,7 @@ dump_ssaname_info (pretty_printer *pp, tree node, int spc)
pp_string (pp, "# PT = ");
pp_points_to_solution (pp, &pi->pt);
newline_and_indent (pp, spc);
- if (get_ptr_info_alignment (pi, &align, &misalign))
+ if (get_ptr_info_alignment (node, &align, &misalign))
{
pp_printf (pp, "# ALIGN = %u, MISALIGN = %u", align, misalign);
newline_and_indent (pp, spc);
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 1daa34ade80..79056fece85 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -6665,9 +6665,9 @@ ipcp_update_vr (struct cgraph_node *node, ipcp_transformation *ts)
align, misalign);
unsigned old_align, old_misalign;
- struct ptr_info_def *pi = get_ptr_info (ddef);
- bool old_known = get_ptr_info_alignment (pi, &old_align,
- &old_misalign);
+ bool old_known
+ = get_ptr_info_alignment (ddef, &old_align,
+ &old_misalign);
if (old_known && old_align > align)
{
@@ -6693,7 +6693,7 @@ ipcp_update_vr (struct cgraph_node *node, ipcp_transformation *ts)
"mismatch\n",
old_misalign, misalign);
- set_ptr_info_alignment (pi, align, misalign);
+ set_ptr_info_alignment (ddef, align, misalign);
}
}
else if (dump_file && INTEGRAL_TYPE_P (TREE_TYPE (parm)))
diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc
index 981346230b0..089c6ae3bf7 100644
--- a/gcc/tree-ssa-ccp.cc
+++ b/gcc/tree-ssa-ccp.cc
@@ -1036,7 +1036,7 @@ ccp_finalize (bool nonzero_p)
tem = val->mask.to_uhwi ();
align = least_bit_hwi (tem);
if (align > 1)
- set_ptr_info_alignment (get_ptr_info (name), align,
+ set_ptr_info_alignment (name, align,
(TREE_INT_CST_LOW (val->value)
& (align - 1)));
}
diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
index 27381e0a473..bab061d6a7b 100644
--- a/gcc/tree-ssa-dom.cc
+++ b/gcc/tree-ssa-dom.cc
@@ -1252,16 +1252,17 @@ maybe_set_nonzero_bits (edge e, tree var)
cst = gimple_assign_rhs2 (stmt);
if (POINTER_TYPE_P (TREE_TYPE (var)))
{
- struct ptr_info_def *pi = SSA_NAME_PTR_INFO (var);
- if (pi && pi->misalign)
+ unsigned int old_align, old_misalign;
+ bool known = get_ptr_info_alignment (var, &old_align, &old_misalign);
+ if (known && old_misalign)
return;
wide_int w = wi::bit_not (wi::to_wide (cst));
unsigned int bits = wi::ctz (w);
if (bits == 0 || bits >= HOST_BITS_PER_INT)
return;
unsigned int align = 1U << bits;
- if (pi == NULL || pi->align < align)
- set_ptr_info_alignment (get_ptr_info (var), align, 0);
+ if (!known || old_align < align)
+ set_ptr_info_alignment (var, align, 0);
}
else
set_nonzero_bits (var, wi::bit_and_not (get_nonzero_bits (var),
diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc
index 006ec7362bc..1a51c7046fb 100644
--- a/gcc/tree-ssa-loop-ivopts.cc
+++ b/gcc/tree-ssa-loop-ivopts.cc
@@ -7547,8 +7547,7 @@ rewrite_use_nonlinear_expr (struct ivopts_data *data,
duplicate_ssa_name_ptr_info (comp, SSA_NAME_PTR_INFO (tgt));
/* As this isn't a plain copy we have to reset alignment
information. */
- if (SSA_NAME_PTR_INFO (comp))
- mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (comp));
+ mark_ptr_info_alignment_unknown (comp);
}
}
diff --git a/gcc/tree-ssa-loop-prefetch.cc b/gcc/tree-ssa-loop-prefetch.cc
index c5437cfdc84..4f53695679d 100644
--- a/gcc/tree-ssa-loop-prefetch.cc
+++ b/gcc/tree-ssa-loop-prefetch.cc
@@ -1214,8 +1214,7 @@ issue_prefetch_ref (struct mem_ref *ref, unsigned unroll_factor, unsigned ahead)
duplicate_ssa_name_ptr_info (addr, SSA_NAME_PTR_INFO (addr_base));
/* As this isn't a plain copy we have to reset alignment
information. */
- if (SSA_NAME_PTR_INFO (addr))
- mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (addr));
+ mark_ptr_info_alignment_unknown (addr);
}
/* Create the prefetch instruction. */
diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index d2f0a93858c..5d50e92a1d3 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -3169,8 +3169,7 @@ create_expression_by_pieces (basic_block block, pre_expr expr,
if ((halign & (halign - 1)) == 0
&& (hmisalign & ~(halign - 1)) == 0
&& (unsigned int)halign != 0)
- set_ptr_info_alignment (get_ptr_info (forcedname),
- halign, hmisalign);
+ set_ptr_info_alignment (forcedname, halign, hmisalign);
}
gimple_set_vuse (call, BB_LIVE_VOP_ON_EXIT (block));
gimple_seq_add_stmt_without_update (&forced_stmts, call);
diff --git a/gcc/tree-ssanames.cc b/gcc/tree-ssanames.cc
index 9f0cddfb38a..5ab3f156e0c 100644
--- a/gcc/tree-ssanames.cc
+++ b/gcc/tree-ssanames.cc
@@ -545,10 +545,10 @@ get_nonzero_bits_1 (const_tree name)
if (POINTER_TYPE_P (TREE_TYPE (name)))
{
- struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
- if (pi && pi->align)
- return wi::shwi (-(HOST_WIDE_INT) pi->align
- | (HOST_WIDE_INT) pi->misalign, precision);
+ unsigned int align, misalign;
+ if (get_ptr_info_alignment (name, &align, &misalign))
+ return wi::shwi (-(HOST_WIDE_INT) align
+ | (HOST_WIDE_INT) misalign, precision);
return wi::shwi (-1, precision);
}
@@ -745,15 +745,18 @@ release_ssa_name_fn (struct function *fn, tree var)
}
}
-/* If the alignment of the pointer described by PI is known, return true and
- store the alignment and the deviation from it into *ALIGNP and *MISALIGNP
- respectively. Otherwise return false. */
+/* If the alignment of the pointer NAME is known, return true and store the
+ alignment and the deviation from it into *ALIGNP and *MISALIGNP
+ respectively. Otherwise return false. A name with no aliasing info has
+ no known alignment, so this is safe to ask about any name. */
bool
-get_ptr_info_alignment (struct ptr_info_def *pi, unsigned int *alignp,
+get_ptr_info_alignment (const_tree name, unsigned int *alignp,
unsigned int *misalignp)
{
- if (pi->align)
+ struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
+
+ if (pi && pi->align)
{
*alignp = pi->align;
*misalignp = pi->misalign;
@@ -763,48 +766,38 @@ get_ptr_info_alignment (struct ptr_info_def *pi, unsigned int *alignp,
return false;
}
-/* State that the pointer described by PI has unknown alignment. */
+/* State that the pointer NAME has unknown alignment. A name with no
+ aliasing info already has unknown alignment, so this is a no-op rather
+ than a reason for the caller to check. */
void
-mark_ptr_info_alignment_unknown (struct ptr_info_def *pi)
+mark_ptr_info_alignment_unknown (tree name)
{
- pi->align = 0;
- pi->misalign = 0;
+ struct ptr_info_def *pi = SSA_NAME_PTR_INFO (name);
+
+ if (pi)
+ {
+ pi->align = 0;
+ pi->misalign = 0;
+ }
}
/* Store the power-of-two byte alignment and the deviation from that
- alignment of pointer described by PI to ALIOGN and MISALIGN
- respectively. */
+ alignment of the pointer NAME to ALIGN and MISALIGN respectively.
+ Aliasing info is created for NAME if it does not have any yet. */
void
-set_ptr_info_alignment (struct ptr_info_def *pi, unsigned int align,
- unsigned int misalign)
+set_ptr_info_alignment (tree name, unsigned int align, unsigned int misalign)
{
gcc_checking_assert (align != 0);
gcc_assert ((align & (align - 1)) == 0);
gcc_assert ((misalign & ~(align - 1)) == 0);
+ struct ptr_info_def *pi = get_ptr_info (name);
pi->align = align;
pi->misalign = misalign;
}
-/* If pointer described by PI has known alignment, increase its known
- misalignment by INCREMENT modulo its current alignment. */
-
-void
-adjust_ptr_info_misalignment (struct ptr_info_def *pi, poly_uint64 increment)
-{
- if (pi->align != 0)
- {
- increment += pi->misalign;
- if (!known_misalignment (increment, pi->align, &pi->misalign))
- {
- pi->align = known_alignment (increment);
- pi->misalign = 0;
- }
- }
-}
-
/* Make PI the aliasing information for NAME. Allocate a VARYING range if
NAME does not already have a range. */
@@ -834,9 +827,10 @@ get_ptr_info (tree t)
pi = SSA_NAME_PTR_INFO (t);
if (pi == NULL)
{
+ // The cleared allocation leaves align and misalign zero, which is
+ // what unknown alignment is, so there is nothing more to initialize.
pi = ggc_cleared_alloc<ptr_info_def> ();
pt_solution_reset (&pi->pt);
- mark_ptr_info_alignment_unknown (pi);
set_ssa_name_ptr_info (t, pi);
}
@@ -950,7 +944,7 @@ reset_flow_sensitive_info (tree name)
set_ssa_name_ptr_info (name, pi);
/* [E]VRP can derive context sensitive alignment info and
non-nullness properties. We must reset both. */
- mark_ptr_info_alignment_unknown (pi);
+ mark_ptr_info_alignment_unknown (name);
pi->pt.null = 1;
}
@@ -1102,19 +1096,13 @@ flow_sensitive_info_storage::save (tree name)
return;
}
state = -1;
- auto ptr_info = SSA_NAME_PTR_INFO (name);
- if (ptr_info)
- {
- align = ptr_info->align;
- misalign = ptr_info->misalign;
- null = SSA_NAME_PTR_INFO (name)->pt.null;
- }
- else
+ if (!get_ptr_info_alignment (name, &align, &misalign))
{
align = 0;
misalign = 0;
- null = true;
}
+ auto ptr_info = SSA_NAME_PTR_INFO (name);
+ null = ptr_info ? ptr_info->pt.null : true;
}
/* Restore the flow sensitive info from NAME. */
@@ -1136,9 +1124,9 @@ flow_sensitive_info_storage::restore (tree name)
if (!ptr_info)
return;
if (align != 0)
- set_ptr_info_alignment (ptr_info, align, misalign);
+ set_ptr_info_alignment (name, align, misalign);
else
- mark_ptr_info_alignment_unknown (ptr_info);
+ mark_ptr_info_alignment_unknown (name);
SSA_NAME_PTR_INFO (name)->pt.null = null;
}
diff --git a/gcc/tree-ssanames.h b/gcc/tree-ssanames.h
index ea38a3bc3c5..311c4c2a161 100644
--- a/gcc/tree-ssanames.h
+++ b/gcc/tree-ssanames.h
@@ -34,9 +34,10 @@ struct GTY(()) ptr_info_def
/* When known, this is the power-of-two byte alignment of the object this
pointer points into. This is usually DECL_ALIGN_UNIT for decls and
MALLOC_ABI_ALIGNMENT for allocated storage. When the alignment is not
- known, it is zero. Do not access directly but use functions
- get_ptr_info_alignment, set_ptr_info_alignment,
- mark_ptr_info_alignment_unknown and similar. */
+ known, it is zero. Do not access directly: the only accessors are
+ get_ptr_info_alignment, set_ptr_info_alignment and
+ mark_ptr_info_alignment_unknown, and they take the SSA name rather
+ than this structure, so that the representation can move. */
unsigned int align;
/* When alignment is known, the byte offset this pointer differs from the
@@ -73,12 +74,10 @@ extern tree make_ssa_name_fn (struct function *, tree, gimple *,
unsigned int version = 0);
extern void init_ssa_name_imm_use (tree);
extern void release_ssa_name_fn (struct function *, tree);
-extern bool get_ptr_info_alignment (struct ptr_info_def *, unsigned int *,
+extern bool get_ptr_info_alignment (const_tree, unsigned int *,
unsigned int *);
-extern void mark_ptr_info_alignment_unknown (struct ptr_info_def *);
-extern void set_ptr_info_alignment (struct ptr_info_def *, unsigned int,
- unsigned int);
-extern void adjust_ptr_info_misalignment (struct ptr_info_def *, poly_uint64);
+extern void mark_ptr_info_alignment_unknown (tree);
+extern void set_ptr_info_alignment (tree, unsigned int, unsigned int);
extern struct ptr_info_def *get_ptr_info (tree);
extern void set_ptr_nonnull (tree);
diff --git a/gcc/tree-vect-data-refs.cc b/gcc/tree-vect-data-refs.cc
index 23235875fa2..b1ec1878c2c 100644
--- a/gcc/tree-vect-data-refs.cc
+++ b/gcc/tree-vect-data-refs.cc
@@ -5553,7 +5553,7 @@ vect_duplicate_ssa_name_ptr_info (tree name, dr_vec_info *dr_info)
duplicate_ssa_name_ptr_info (name, DR_PTR_INFO (dr_info->dr));
/* DR_PTR_INFO is for a base SSA name, not including constant or
variable offsets in the ref so its alignment info does not apply. */
- mark_ptr_info_alignment_unknown (SSA_NAME_PTR_INFO (name));
+ mark_ptr_info_alignment_unknown (name);
}
else if (!SSA_NAME_PTR_INFO (name))
{
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 785dac77538..a8215fac9ed 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -227,7 +227,7 @@ create_array_ref (tree type, tree ptr, tree alias_ptr_type)
mem_ref = build2 (MEM_REF, type, ptr, build_int_cst (alias_ptr_type, 0));
/* Arrays have the same alignment as their type. */
- set_ptr_info_alignment (get_ptr_info (ptr), TYPE_ALIGN_UNIT (type), 0);
+ set_ptr_info_alignment (ptr, TYPE_ALIGN_UNIT (type), 0);
return mem_ref;
}
@@ -9464,7 +9464,7 @@ vectorizable_store (vec_info *vinfo,
misalign = misalignment;
if (dataref_offset == NULL_TREE
&& TREE_CODE (dataref_ptr) == SSA_NAME)
- set_ptr_info_alignment (get_ptr_info (dataref_ptr), align, misalign);
+ set_ptr_info_alignment (dataref_ptr, align, misalign);
align = least_bit_hwi (misalign | align);
/* Compute IFN when LOOP_LENS or final_mask valid. */
@@ -11521,8 +11521,7 @@ vectorizable_load (vec_info *vinfo,
misalign = misalignment;
if (dataref_offset == NULL_TREE
&& TREE_CODE (dataref_ptr) == SSA_NAME)
- set_ptr_info_alignment (get_ptr_info (dataref_ptr), align,
- misalign);
+ set_ptr_info_alignment (dataref_ptr, align, misalign);
align = least_bit_hwi (misalign | align);
/* Compute IFN when LOOP_LENS or final_mask valid. */
--
2.56.0