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? 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