From: Eric Botcazou <botcazou@adacore.com>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH] Handle addresses of more constants in IPA-CP
Date: Sat, 11 Nov 2023 13:11:28 +0100 [thread overview]
Message-ID: <2245595.iZASKD2KPV@fomalhaut> (raw)
[-- 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",
next reply other threads:[~2023-11-11 12:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-11 12:11 Eric Botcazou [this message]
2023-11-11 18:32 ` Jeff Law
2024-11-14 12:48 ` [PATCH] ipa-cp: Fix constant dumping Martin Jambor
2024-11-14 13:07 ` Eric Botcazou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2245595.iZASKD2KPV@fomalhaut \
--to=botcazou@adacore.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).