Hi,
The main part is to move, privatize and rename gimple_ior_addresses_taken &
gimple_ior_addresses_taken_1 from gimple.cc. This in turn makes it possible
to call the latter for the processing of PHI nodes instead of duplicating the
internal logic.
Tested on x86-64/Linux, OK for the mainline?
2026-10-06 Eric Botcazou <[email protected]>
* gimple.h (gimple_ior_addresses_taken): Delete.
* gimple.cc (gimple_ior_addresses_taken_1): Move to...
(gimple_ior_addresses_taken): Move to...
* tree-ssa.cc (gimple_ior_addresses_taken_1): ...here and rename
into set_addresses_taken_1.
(gimple_ior_addresses_taken): ...here, swap the parameters and
rename into set_addresses_taken.
(execute_update_addresses_taken): Adjust to above changes and
call set_addresses_taken_1 for the processing of PHI nodes.
--
Eric Botcazoudiff --git a/gcc/gimple.cc b/gcc/gimple.cc
index 04ad17f5955..3b68902b610 100644
--- a/gcc/gimple.cc
+++ b/gcc/gimple.cc
@@ -2915,34 +2915,6 @@ gimple_get_alias_set (tree t)
}
-/* Helper for gimple_ior_addresses_taken_1. */
-
-static bool
-gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data)
-{
- bitmap addresses_taken = (bitmap)data;
- addr = get_base_address (addr);
- if (addr
- && DECL_P (addr))
- {
- bitmap_set_bit (addresses_taken, DECL_UID (addr));
- return true;
- }
- return false;
-}
-
-/* Set the bit for the uid of all decls that have their address taken
- in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there
- were any in this stmt. */
-
-bool
-gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt)
-{
- return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
- gimple_ior_addresses_taken_1);
-}
-
-
/* Return true when STMTs arguments and return value match those of FNDECL,
a decl of a builtin function. */
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 82045c44bbe..0245e5e0934 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -1660,7 +1660,6 @@ extern bool gimple_compare_field_offset (tree, tree);
extern tree gimple_unsigned_type (tree);
extern tree gimple_signed_type (tree);
extern alias_set_type gimple_get_alias_set (tree);
-extern bool gimple_ior_addresses_taken (bitmap, gimple *);
extern bool gimple_builtin_call_types_compatible_p (const gimple *, tree);
extern combined_fn gimple_call_combined_fn (const gimple *);
extern bool gimple_call_operator_delete_p (const gcall *);
diff --git a/gcc/tree-ssa.cc b/gcc/tree-ssa.cc
index 4f94edb2f4b..436c88d47d5 100644
--- a/gcc/tree-ssa.cc
+++ b/gcc/tree-ssa.cc
@@ -1882,6 +1882,33 @@ is_asan_mark_p (gimple *stmt)
return false;
}
+/* Helper for set_addresses_taken. If the base of ADDR is a DECL,
+ set the bit for its uid in the bitmap passed as DATA and return
+ true; otherwise return false. */
+
+static bool
+set_addresses_taken_1 (gimple *, tree addr, tree, void *data)
+{
+ bitmap addresses_taken = (bitmap)data;
+ addr = get_base_address (addr);
+ if (addr && DECL_P (addr))
+ {
+ bitmap_set_bit (addresses_taken, DECL_UID (addr));
+ return true;
+ }
+ return false;
+}
+
+/* Set the bit for the uid of all DECLs that have their address taken in
+ STMT in the ADDRESSES_TAKEN bitmap. Return true if there are any. */
+
+static bool
+set_addresses_taken (gimple *stmt, bitmap addresses_taken)
+{
+ return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL,
+ set_addresses_taken_1);
+}
+
/* Compute TREE_ADDRESSABLE and whether we have unhandled partial defs
for local variables. */
@@ -1919,7 +1946,7 @@ execute_update_addresses_taken (void)
ATOMIC_COMPARE_EXCHANGE call. */
tree arg = gimple_call_arg (stmt, 1);
gimple_call_set_arg (stmt, 1, null_pointer_node);
- gimple_ior_addresses_taken (addresses_taken, stmt);
+ set_addresses_taken (stmt, addresses_taken);
gimple_call_set_arg (stmt, 1, arg);
/* Remember we have to check again below. */
optimistic_not_addressable = true;
@@ -1928,11 +1955,11 @@ execute_update_addresses_taken (void)
|| gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
;
else
- gimple_ior_addresses_taken (addresses_taken, stmt);
+ set_addresses_taken (stmt, addresses_taken);
}
else
/* Note all addresses taken by the stmt. */
- gimple_ior_addresses_taken (addresses_taken, stmt);
+ set_addresses_taken (stmt, addresses_taken);
/* If we have a call or an assignment, see if the lhs contains
a local decl that requires not to be a gimple register. */
@@ -1999,16 +2026,14 @@ execute_update_addresses_taken (void)
for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
gsi_next (&gsi))
{
- size_t i;
gphi *phi = gsi.phi ();
for (i = 0; i < gimple_phi_num_args (phi); i++)
{
- tree op = PHI_ARG_DEF (phi, i), var;
- if (TREE_CODE (op) == ADDR_EXPR
- && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
- && DECL_P (var))
- bitmap_set_bit (addresses_taken, DECL_UID (var));
+ tree op = PHI_ARG_DEF (phi, i);
+ if (TREE_CODE (op) == ADDR_EXPR)
+ set_addresses_taken_1 (phi, TREE_OPERAND (op, 0), op,
+ (void *)addresses_taken);
}
}
}