Hello, On Sat, Nov 11 2023, 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.
unfortunately, in C++ it is not enough to verify that the source still builds with a function removed to conclude that the function is unused. After this patch, dumping of IPA-CP scalar constant lattices is broken because we attempt to print them with (what was) an print_ipcp_constant_value overload for polymorphic contexts which are constructible from trees, so the source compiles, but of course are not what we want. I'm about to commit the following patch as obvious (after it has passed bootstrap and testing on x86_64-linux which is currently underway) and also backport it to the gcc-14 branch. Thanks, Martin > > 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 <ebotca...@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. > ---------- 8< -------------------- 8< -------------------- 8< ---------- Commit gcc-14-5368-ge0787da2633 removed an overloaded variant of function print_ipcp_constant_value for tree constants. That did not break build because the other overloaded variant for polymorphic contexts-has a parameter which is constructible from a tree, but it prints polymorphic contexts, not tree constants, so we in dumps we got things like: param [0]: VARIABLE ctxs: VARIABLE Bits: value = 0x0, mask = 0xfffffffffffffffc [prange] struct S * [1, +INF] MASK 0xfffffffffffffffc VALUE 0x0 ref offset 0: nothing known [scc: 1, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] ref offset 32: nothing known [scc: 2, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] ref offset 64: nothing known [scc: 3, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] instead of: param [0]: VARIABLE ctxs: VARIABLE Bits: value = 0x0, mask = 0xfffffffffffffffc [prange] struct S * [1, +INF] MASK 0xfffffffffffffffc VALUE 0x0 ref offset 0: 1 [scc: 1, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] ref offset 32: 64 [scc: 2, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] ref offset 64: 32 [scc: 3, from: 1(1.000000)] [loc_time: 0, loc_size: 0, prop_time: 0, prop_size: 0] This commit re-adds the needed overloaded variant though it uses the printing function added in the aforementioned commit instead of printing it itself. gcc/ChangeLog: 2024-11-13 Martin Jambor <mjam...@suse.cz> * ipa-prop.h (ipa_print_constant_value): Declare. * ipa-prop.cc (ipa_print_constant_value): Make public. * ipa-cp.cc (print_ipcp_constant_value): Re-add this overloaded function for printing tree constants. gcc/testsuite/ChangeLog: 2024-11-14 Martin Jambor <mjam...@suse.cz> * gcc.dg/ipa/ipcp-agg-1.c: Add a scan dump for a constant value in the latice dump. --- gcc/ipa-cp.cc | 12 +++++++++++- gcc/ipa-prop.cc | 2 +- gcc/ipa-prop.h | 1 + gcc/testsuite/gcc.dg/ipa/ipcp-agg-1.c | 1 + 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc index 212d9ccbbfe..fb65ec0c6a6 100644 --- a/gcc/ipa-cp.cc +++ b/gcc/ipa-cp.cc @@ -225,7 +225,17 @@ values_equal_for_ipcp_p (tree x, tree y) return operand_equal_p (x, y, 0); } -/* Print V which is extracted from a value in a lattice to F. */ +/* Print V which is extracted from a value in a lattice to F. This overloaded + function is used to print tree constants. */ + +static void +print_ipcp_constant_value (FILE * f, tree v) +{ + ipa_print_constant_value (f, v); +} + +/* Print V which is extracted from a value in a lattice to F. This overloaded + function is used to print constant polymorphic call contexts. */ 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 599181d0a94..fd18f847e46 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -413,7 +413,7 @@ ipa_initialize_node_params (struct cgraph_node *node) /* Print VAL which is extracted from a jump function to F. */ -static void +void ipa_print_constant_value (FILE *f, tree val) { print_generic_expr (f, val); diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h index 7a05c169c42..a9ef3fe3aa6 100644 --- a/gcc/ipa-prop.h +++ b/gcc/ipa-prop.h @@ -1179,6 +1179,7 @@ ipcp_get_transformation_summary (cgraph_node *node) /* Function formal parameters related computations. */ void ipa_initialize_node_params (struct cgraph_node *node); +void ipa_print_constant_value (FILE *f, tree val); bool ipa_propagate_indirect_call_infos (struct cgraph_edge *cs, vec<cgraph_edge *> *new_edges); diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-agg-1.c b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-1.c index 8cfc18799fa..15f6286e54b 100644 --- a/gcc/testsuite/gcc.dg/ipa/ipcp-agg-1.c +++ b/gcc/testsuite/gcc.dg/ipa/ipcp-agg-1.c @@ -30,6 +30,7 @@ entry (void) foo (&s); } +/* { dg-final { scan-ipa-dump "ref offset\[^\n\r\]*: 64\[^\n\r\]*scc:" "cp" } } */ /* { dg-final { scan-ipa-dump "Creating a specialized node of foo.*for all known contexts" "cp" } } */ /* { dg-final { scan-ipa-dump-times "Aggregate replacements:" 2 "cp" } } */ /* { dg-final { scan-tree-dump-not "->c;" "optimized" } } */ -- 2.47.0