On Thu, 27 Feb 2020, Jakub Jelinek wrote: > Hi! > > And here is the corresponding 9.x change where we the patch just punts if > ref->size is not whole bytes, like we already punt if offseti is not byte > aligned. > > Tested on x86_64-linux and powerpc64-linux, ok for 9.3?
OK. Thanks, Richard. > 2020-02-27 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/93945 > * tree-ssa-sccvn.c (vn_reference_lookup_3): For memset with non-zero > second operand, require ref->size to be a multiple of BITS_PER_UNIT. > > * gcc.c-torture/execute/pr93945.c: New test. > > --- gcc/tree-ssa-sccvn.c.jj 2020-01-12 12:17:01.031158921 +0100 > +++ gcc/tree-ssa-sccvn.c 2020-02-27 10:55:16.226236453 +0100 > @@ -2113,7 +2113,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree > || (INTEGRAL_TYPE_P (vr->type) && known_eq (ref->size, 8))) > && CHAR_BIT == 8 && BITS_PER_UNIT == 8 > && offset.is_constant (&offseti) > - && offseti % BITS_PER_UNIT == 0)) > + && offseti % BITS_PER_UNIT == 0 > + && multiple_p (ref->size, BITS_PER_UNIT))) > && poly_int_tree_p (gimple_call_arg (def_stmt, 2)) > && (TREE_CODE (gimple_call_arg (def_stmt, 0)) == ADDR_EXPR > || TREE_CODE (gimple_call_arg (def_stmt, 0)) == SSA_NAME)) > --- gcc/testsuite/gcc.c-torture/execute/pr93945.c.jj 2020-02-27 > 10:54:21.234060635 +0100 > +++ gcc/testsuite/gcc.c-torture/execute/pr93945.c 2020-02-27 > 10:54:21.234060635 +0100 > @@ -0,0 +1,45 @@ > +/* PR tree-optimization/93945 */ > + > +union U { char a[8]; struct S { unsigned int b : 8, c : 13, d : 11; } e; } u; > + > +__attribute__((noipa)) int > +foo (void) > +{ > + __builtin_memset (&u.a, 0xf4, sizeof (u.a)); > + return u.e.c; > +} > + > +__attribute__((noipa)) int > +bar (void) > +{ > + asm volatile ("" : : "g" (&u) : "memory"); > + return u.e.c; > +} > + > +__attribute__((noipa)) int > +baz (void) > +{ > + __builtin_memset (&u.a, 0xf4, sizeof (u.a)); > + return u.e.d; > +} > + > +__attribute__((noipa)) int > +qux (void) > +{ > + asm volatile ("" : : "g" (&u) : "memory"); > + return u.e.d; > +} > + > +int > +main () > +{ > + int a = foo (); > + int b = bar (); > + if (a != b) > + __builtin_abort (); > + a = baz (); > + b = qux (); > + if (a != b) > + __builtin_abort (); > + return 0; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)