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 Botcazou
diff --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);
 	    }
 	}
     }

Reply via email to