On Fri, Mar 31, 2023 at 10:46 AM Martin Jambor <mjam...@suse.cz> wrote: > > Hi, > > we are in the process of changing data structures holding information > about constants passed by reference and in aggregates to use unsigned > int offsets rather than HOST_WIDE_INT (which was selected simply > because that is what fell out of get_ref_base_and_extent at that time) > in order to conserve memory, especially at WPA time. > > PR 109303 testcase discovers that we do not properly check that we > only create jump functions with offsets (plus sizes) that fit into the > smaller type. This patch adds the necessary check. > > Bootstrapped and tested on x86_64-linux. OK for master? > > Thanks, > > Martin > > > gcc/ChangeLog: > > 2023-03-30 Martin Jambor <mjam...@suse.cz> > > PR ipa/109303 > * ipa-prop.cc (determine_known_aggregate_parts): Check that the > offset + size will be representable in unsigned int. > > gcc/testsuite/ChangeLog: > > 2023-03-30 Jakub Jelinek <ja...@redhat.com> > Martin Jambor <mjam...@suse.cz> > > PR ipa/109303 > * gcc.dg/pr109303.c: New test. > --- > gcc/ipa-prop.cc | 4 +++- > gcc/testsuite/gcc.dg/pr109303.c | 24 ++++++++++++++++++++++++ > 2 files changed, 27 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.dg/pr109303.c > > diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc > index de45dbccf16..9ffd49b590c 100644 > --- a/gcc/ipa-prop.cc > +++ b/gcc/ipa-prop.cc > @@ -2086,7 +2086,9 @@ determine_known_aggregate_parts (struct > ipa_func_body_info *fbi, > whether its value is clobbered any other dominating one. */ > if ((content->value.pass_through.formal_id >= 0 > || content->value.pass_through.operand) > - && !clobber_by_agg_contents_list_p (all_list, content)) > + && !clobber_by_agg_contents_list_p (all_list, content) > + && (content->offset + content->size - arg_offset > + <= (HOST_WIDE_INT) UINT_MAX * BITS_PER_UNIT)) > {
it does seem a bit misplaced since after the if we add the same 'content' to another list anyway. Wouldn't a more obvious place be where we end up truncating this sum? > struct ipa_known_agg_contents_list *copy > = XALLOCA (struct ipa_known_agg_contents_list); > diff --git a/gcc/testsuite/gcc.dg/pr109303.c b/gcc/testsuite/gcc.dg/pr109303.c > new file mode 100644 > index 00000000000..f91535991c7 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr109303.c > @@ -0,0 +1,24 @@ > +/* PR ipa/109303 */ > +/* { dg-do compile { target lp64 } } */ > +/* { dg-options "-O2" } */ > + > +struct __attribute__((packed)) A { char c1; short a1[__INT_MAX__]; }; > +struct __attribute__((packed)) B { char c2; short a2[100]; }; > +struct S { struct A p1; struct B p2[4]; }; > +void bar (short int); > + > +static void > +foo (struct S *q) > +{ > + for (int i = 0; i < q->p1.c1; i++) > + for (int j = 0; j < q->p2[i].c2; j++) > + bar (q->p2[i].a2[j]); > +} > + > +int > +main () > +{ > + struct S q = {}; > + q.p2[0].c2 = q.p2[1].c2 = 3; > + foo (&q); > +} > -- > 2.40.0 >