public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Handle addresses of more constants in IPA-CP
@ 2023-11-11 12:11 Eric Botcazou
  2023-11-11 18:32 ` Jeff Law
  0 siblings, 1 reply; 2+ messages in thread
From: Eric Botcazou @ 2023-11-11 12:11 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 988 bytes --]

Hi,

IPA-CP can currently handle addresses of scalar constants (CONST_DECL) so this 
extends that to addresses of constants in the pool (DECL_IN_CONSTANT_POOL).
Again this is helpful for so-called fat pointers in Ada, i.e. objects that are 
semantically pointers but represented by structures made up of two pointers. 

This also moves the unused function print_ipcp_constant_value from ipa-cp.cc 
to ipa-prop.cc and renames it.

I have an LTO testcase for which this makes a difference, but it's large so 
not really suitable for the testsuite.

Bootstrapped/regtested on x86-64/Linux, OK for the mainline?


2023-11-11  Eric Botcazou  <ebotcazou@adacore.com>

	* ipa-cp.cc (print_ipcp_constant_value): Move to...
	(values_equal_for_ipcp_p): Deal with VAR_DECLs from the
	constant pool.
	* ipa-prop.cc (ipa_print_constant_value): ...here.  Likewise.
	(ipa_print_node_jump_functions_for_edge): Call the function
	ipa_print_constant_value to print IPA_JF_CONST elements.

-- 
Eric Botcazou

[-- Attachment #2: p.diff --]
[-- Type: text/x-patch, Size: 3489 bytes --]

diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index 788157ebd55..34fae065454 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -478,31 +478,21 @@ values_equal_for_ipcp_p (tree x, tree y)
 
   if (TREE_CODE (x) == ADDR_EXPR
       && TREE_CODE (y) == ADDR_EXPR
-      && TREE_CODE (TREE_OPERAND (x, 0)) == CONST_DECL
-      && TREE_CODE (TREE_OPERAND (y, 0)) == CONST_DECL)
-    return operand_equal_p (DECL_INITIAL (TREE_OPERAND (x, 0)),
-			    DECL_INITIAL (TREE_OPERAND (y, 0)), 0);
+      && (TREE_CODE (TREE_OPERAND (x, 0)) == CONST_DECL
+	  || (TREE_CODE (TREE_OPERAND (x, 0)) == VAR_DECL
+	      && DECL_IN_CONSTANT_POOL (TREE_OPERAND (x, 0))))
+      && (TREE_CODE (TREE_OPERAND (y, 0)) == CONST_DECL
+	  || (TREE_CODE (TREE_OPERAND (y, 0)) == VAR_DECL
+	      && DECL_IN_CONSTANT_POOL (TREE_OPERAND (y, 0)))))
+    return TREE_OPERAND (x, 0) == TREE_OPERAND (y, 0)
+	   || operand_equal_p (DECL_INITIAL (TREE_OPERAND (x, 0)),
+			       DECL_INITIAL (TREE_OPERAND (y, 0)), 0);
   else
     return operand_equal_p (x, y, 0);
 }
 
 /* Print V which is extracted from a value in a lattice to F.  */
 
-static void
-print_ipcp_constant_value (FILE * f, tree v)
-{
-  if (TREE_CODE (v) == ADDR_EXPR
-      && TREE_CODE (TREE_OPERAND (v, 0)) == CONST_DECL)
-    {
-      fprintf (f, "& ");
-      print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (v, 0)));
-    }
-  else
-    print_generic_expr (f, v);
-}
-
-/* Print V which is extracted from a value in a lattice to F.  */
-
 static void
 print_ipcp_constant_value (FILE * f, ipa_polymorphic_call_context v)
 {
diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
index 827bdb691ba..7de2b788185 100644
--- a/gcc/ipa-prop.cc
+++ b/gcc/ipa-prop.cc
@@ -365,6 +365,24 @@ ipa_initialize_node_params (struct cgraph_node *node)
     ipa_populate_param_decls (node, *info->descriptors);
 }
 
+/* Print VAL which is extracted from a jump function to F.  */
+
+static void
+ipa_print_constant_value (FILE *f, tree val)
+{
+  print_generic_expr (f, val);
+
+  /* This is in keeping with values_equal_for_ipcp_p.  */
+  if (TREE_CODE (val) == ADDR_EXPR
+      && (TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL
+	  || (TREE_CODE (TREE_OPERAND (val, 0)) == VAR_DECL
+	      && DECL_IN_CONSTANT_POOL (TREE_OPERAND (val, 0)))))
+    {
+      fputs (" -> ", f);
+      print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)));
+    }
+}
+
 /* Print the jump functions associated with call graph edge CS to file F.  */
 
 static void
@@ -386,15 +404,8 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
 	fprintf (f, "UNKNOWN\n");
       else if (type == IPA_JF_CONST)
 	{
-	  tree val = jump_func->value.constant.value;
 	  fprintf (f, "CONST: ");
-	  print_generic_expr (f, val);
-	  if (TREE_CODE (val) == ADDR_EXPR
-	      && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
-	    {
-	      fprintf (f, " -> ");
-	      print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)));
-	    }
+	  ipa_print_constant_value (f, jump_func->value.constant.value);
 	  fprintf (f, "\n");
 	}
       else if (type == IPA_JF_PASS_THROUGH)
@@ -468,7 +479,7 @@ ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
 	      else if (item->jftype == IPA_JF_CONST)
 		{
 		  fprintf (f, "CONST: ");
-		  print_generic_expr (f, item->value.constant);
+		  ipa_print_constant_value (f, item->value.constant);
 		}
 	      else if (item->jftype == IPA_JF_UNKNOWN)
 		fprintf (f, "UNKNOWN: " HOST_WIDE_INT_PRINT_DEC " bits",

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] Handle addresses of more constants in IPA-CP
  2023-11-11 12:11 [PATCH] Handle addresses of more constants in IPA-CP Eric Botcazou
@ 2023-11-11 18:32 ` Jeff Law
  0 siblings, 0 replies; 2+ messages in thread
From: Jeff Law @ 2023-11-11 18:32 UTC (permalink / raw)
  To: Eric Botcazou, gcc-patches



On 11/11/23 05:11, Eric Botcazou wrote:
> Hi,
> 
> IPA-CP can currently handle addresses of scalar constants (CONST_DECL) so this
> extends that to addresses of constants in the pool (DECL_IN_CONSTANT_POOL).
> Again this is helpful for so-called fat pointers in Ada, i.e. objects that are
> semantically pointers but represented by structures made up of two pointers.
> 
> This also moves the unused function print_ipcp_constant_value from ipa-cp.cc
> to ipa-prop.cc and renames it.
> 
> I have an LTO testcase for which this makes a difference, but it's large so
> not really suitable for the testsuite.
> 
> Bootstrapped/regtested on x86-64/Linux, OK for the mainline?
> 
> 
> 2023-11-11  Eric Botcazou  <ebotcazou@adacore.com>
> 
> 	* ipa-cp.cc (print_ipcp_constant_value): Move to...
> 	(values_equal_for_ipcp_p): Deal with VAR_DECLs from the
> 	constant pool.
> 	* ipa-prop.cc (ipa_print_constant_value): ...here.  Likewise.
> 	(ipa_print_node_jump_functions_for_edge): Call the function
> 	ipa_print_constant_value to print IPA_JF_CONST elements.
> 
OK
jeff

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-11-11 18:32 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-11 12:11 [PATCH] Handle addresses of more constants in IPA-CP Eric Botcazou
2023-11-11 18:32 ` Jeff Law

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).