Hello, and a gentle ping, please.
Martin On Fri, Jan 24 2025, Martin Jambor wrote: > Hi, > > the following version of the patch has one of the testcase adjusted to > use long long and so pass also on 32bit i386 (and hopefully 32bit Arm > too), otherwise it has not changed from what I posted on Wednesday. > > OK for master? > > Thanks, > > Martin > > ---------- 8< ---------- > > One of the testcases from PR 118097 and the one from PR 118535 show > that the fix to PR 118138 was incomplete. We must not only make sure > that (intermediate) results of operations performed by IPA-CP are > fold_converted to the type of the destination formal parameter but we > also must decouple the these types from the ones in which operations > are performed. > > This patch does that, even though we do not store or stream the > operation types, instead we simply limit ourselves to tcc_comparisons > and operations for which the first operand and the result are of the > same type as determined by expr_type_first_operand_type_p. If we > wanted to go beyond these, we would indeed need to store/stream the > respective operation type. > > ipa_value_from_jfunc needs an additional check that res_type is not > NULL because it is not called just from within IPA-CP (where we know > we have a destination lattice slot belonging to a defined parameter) > but also from inlining, ipa-fnsummary and ipa-modref where it is used > to examine a call to a function with variadic arguments and we do not > have types for the unknown parameters. But we cannot really work with > those or estimate any benefits when it comes to them, so ignoring them > should be OK. > > Even after this patch, ipa_get_jf_arith_result has a parameter called > res_type in which it performs operations for aggregate jump functions, > where we do not allow type conversions when constucting the jump > functions and the type is the type of the stored data. In GCC 16, we > could relax this and allow conversions like for scalars. > > gcc/ChangeLog: > > 2025-01-20 Martin Jambor <mjam...@suse.cz> > > PR ipa/118097 > * ipa-cp.cc (ipa_get_jf_arith_result): Adjust comment. > (ipa_get_jf_pass_through_result): Removed. > (ipa_value_from_jfunc): Use directly ipa_get_jf_arith_result, do > not specify operation type but make sure we check and possibly > convert the result. > (get_val_across_arith_op): Remove the last parameter, always pass > NULL_TREE to ipa_get_jf_arith_result in its last argument. > (propagate_vals_across_arith_jfunc): Do not pass res_type to > get_val_across_arith_op. > (propagate_vals_across_pass_through): Add checking assert that > parm_type is not NULL. > > gcc/testsuite/ChangeLog: > > 2025-01-24 Martin Jambor <mjam...@suse.cz> > > PR ipa/118097 > * gcc.dg/ipa/pr118097.c: New test. > * gcc.dg/ipa/pr118535.c: Likewise. > * gcc.dg/ipa/ipa-notypes-1.c: Likewise. > --- > gcc/ipa-cp.cc | 46 ++++++++++-------------- > gcc/testsuite/gcc.dg/ipa/ipa-notypes-1.c | 17 +++++++++ > gcc/testsuite/gcc.dg/ipa/pr118097.c | 23 ++++++++++++ > gcc/testsuite/gcc.dg/ipa/pr118535.c | 17 +++++++++ > 4 files changed, 75 insertions(+), 28 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/ipa/ipa-notypes-1.c > create mode 100644 gcc/testsuite/gcc.dg/ipa/pr118097.c > create mode 100644 gcc/testsuite/gcc.dg/ipa/pr118535.c > > diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc > index d89324a0077..68959f2677b 100644 > --- a/gcc/ipa-cp.cc > +++ b/gcc/ipa-cp.cc > @@ -1467,11 +1467,10 @@ ipacp_value_safe_for_type (tree param_type, tree > value) > return NULL_TREE; > } > > -/* Return the result of a (possibly arithmetic) operation on the constant > - value INPUT. OPERAND is 2nd operand for binary operation. RES_TYPE is > - the type of the parameter to which the result is passed. Return > - NULL_TREE if that cannot be determined or be considered an > - interprocedural invariant. */ > +/* Return the result of a (possibly arithmetic) operation on the constant > value > + INPUT. OPERAND is 2nd operand for binary operation. RES_TYPE is the type > + in which any operation is to be performed. Return NULL_TREE if that > cannot > + be determined or be considered an interprocedural invariant. */ > > static tree > ipa_get_jf_arith_result (enum tree_code opcode, tree input, tree operand, > @@ -1513,21 +1512,6 @@ ipa_get_jf_arith_result (enum tree_code opcode, tree > input, tree operand, > return res; > } > > -/* Return the result of a (possibly arithmetic) pass through jump function > - JFUNC on the constant value INPUT. RES_TYPE is the type of the parameter > - to which the result is passed. Return NULL_TREE if that cannot be > - determined or be considered an interprocedural invariant. */ > - > -static tree > -ipa_get_jf_pass_through_result (struct ipa_jump_func *jfunc, tree input, > - tree res_type) > -{ > - return ipa_get_jf_arith_result (ipa_get_jf_pass_through_operation (jfunc), > - input, > - ipa_get_jf_pass_through_operand (jfunc), > - res_type); > -} > - > /* Return the result of an ancestor jump function JFUNC on the constant value > INPUT. Return NULL_TREE if that cannot be determined. */ > > @@ -1595,7 +1579,14 @@ ipa_value_from_jfunc (class ipa_node_params *info, > struct ipa_jump_func *jfunc, > return NULL_TREE; > > if (jfunc->type == IPA_JF_PASS_THROUGH) > - return ipa_get_jf_pass_through_result (jfunc, input, parm_type); > + { > + if (!parm_type) > + return NULL_TREE; > + enum tree_code opcode = ipa_get_jf_pass_through_operation (jfunc); > + tree op2 = ipa_get_jf_pass_through_operand (jfunc); > + tree cstval = ipa_get_jf_arith_result (opcode, input, op2, NULL_TREE); > + return ipacp_value_safe_for_type (parm_type, cstval); > + } > else > return ipa_get_jf_ancestor_result (jfunc, input); > } > @@ -2120,15 +2111,13 @@ ipcp_lattice<valtype>::add_value (valtype newval, > cgraph_edge *cs, > /* A helper function that returns result of operation specified by OPCODE on > the value of SRC_VAL. If non-NULL, OPND1_TYPE is expected type for the > value of SRC_VAL. If the operation is binary, OPND2 is a constant value > - acting as its second operand. If non-NULL, RES_TYPE is expected type of > - the result. */ > + acting as its second operand. */ > > static tree > get_val_across_arith_op (enum tree_code opcode, > tree opnd1_type, > tree opnd2, > - ipcp_value<tree> *src_val, > - tree res_type) > + ipcp_value<tree> *src_val) > { > tree opnd1 = src_val->value; > > @@ -2137,7 +2126,7 @@ get_val_across_arith_op (enum tree_code opcode, > && !useless_type_conversion_p (opnd1_type, TREE_TYPE (opnd1))) > return NULL_TREE; > > - return ipa_get_jf_arith_result (opcode, opnd1, opnd2, res_type); > + return ipa_get_jf_arith_result (opcode, opnd1, opnd2, NULL_TREE); > } > > /* Propagate values through an arithmetic transformation described by a jump > @@ -2213,7 +2202,7 @@ propagate_vals_across_arith_jfunc (cgraph_edge *cs, > for (int j = 1; j < max_recursive_depth; j++) > { > tree cstval = get_val_across_arith_op (opcode, opnd1_type, opnd2, > - src_val, res_type); > + src_val); > cstval = ipacp_value_safe_for_type (res_type, cstval); > if (!cstval) > break; > @@ -2238,7 +2227,7 @@ propagate_vals_across_arith_jfunc (cgraph_edge *cs, > } > > tree cstval = get_val_across_arith_op (opcode, opnd1_type, opnd2, > - src_val, res_type); > + src_val); > cstval = ipacp_value_safe_for_type (res_type, cstval); > if (cstval) > ret |= dest_lat->add_value (cstval, cs, src_val, src_idx, > @@ -2261,6 +2250,7 @@ propagate_vals_across_pass_through (cgraph_edge *cs, > ipa_jump_func *jfunc, > ipcp_lattice<tree> *dest_lat, int src_idx, > tree parm_type) > { > + gcc_checking_assert (parm_type); > return propagate_vals_across_arith_jfunc (cs, > ipa_get_jf_pass_through_operation (jfunc), > NULL_TREE, > diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-notypes-1.c > b/gcc/testsuite/gcc.dg/ipa/ipa-notypes-1.c > new file mode 100644 > index 00000000000..e8f4adaed17 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/ipa-notypes-1.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2" } */ > + > +void some_memcpy(void *, long); > +long bufused; > +char buf, otest_s; > +void otest(...) { > + long slength; > + some_memcpy(&buf + bufused, slength & otest_s); > +} > +int f, finish_root_table_fli2_1; > +static void finish_root_table(char *lastname) { > + for (;;) > + if (finish_root_table_fli2_1) > + otest(f, lastname); > +} > +void write_roots() { finish_root_table(""); } > diff --git a/gcc/testsuite/gcc.dg/ipa/pr118097.c > b/gcc/testsuite/gcc.dg/ipa/pr118097.c > new file mode 100644 > index 00000000000..6e6de96c7e0 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/pr118097.c > @@ -0,0 +1,23 @@ > +/* { dg-do run { target longlong64 } } */ > +/* { dg-options "-O2 -fno-inline" } */ > + > +int a, b, c, *d = &a; > +long long e; > +static long long am (long long f, int g) { > + return g == 0 || f == 1 && g == 1 ?: f / g; > +} > +static void aq (unsigned f) > +{ > + c ^= e = am(~f, 1); > + b = 7 - (e >= 1) - 33; > + *d = b; > +} > + > +int main() { > + // am(1, 1); > + aq(1); > + if (a == 0xffffffffffffffe5) > + ; > + else > + __builtin_abort(); > +} > diff --git a/gcc/testsuite/gcc.dg/ipa/pr118535.c > b/gcc/testsuite/gcc.dg/ipa/pr118535.c > new file mode 100644 > index 00000000000..960ba4a5db2 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/ipa/pr118535.c > @@ -0,0 +1,17 @@ > +/* { dg-do run } */ > +/* { dg-options "-O2" } */ > + > +int a, b, c, d, e, f, *g = &b; > +static int h(int i) { return i < 0 || i > a ? 0 : i << a; } > +static int j(unsigned short i) { > + f = d == e; > + *g = h(65535 ^ i); > + return c; > +} > +int main() { > + j(0); > + h(0); > + if (b != 0) > + __builtin_abort(); > + return 0; > +} > -- > 2.47.1