[Bug tree-optimization/92486] Wrong optimization: padding in structs is not copied even with memcpy
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Fri Nov 15 07:46:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92486
--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 14 Nov 2019, ch3root at openwall dot com wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92486
>
> --- Comment #9 from Alexander Cherepanov <ch3root at openwall dot com> ---
> > Now as an exercise build a complete testcase for the DSE issue above.
>
> Source code:
>
> ----------------------------------------------------------------------
> #include <string.h>
> #include <stdio.h>
>
> struct s {
> char c;
> int i;
> };
>
> __attribute__((noinline,noclone))
> void f(struct s *p, struct s *q)
> {
> struct s w;
>
> memset(&w, 0, sizeof(struct s));
> w = *q;
>
> memset(p, 0, sizeof(struct s));
> *p = w;
> }
>
> int main()
> {
> struct s x;
> memset(&x, 1, sizeof(struct s));
>
> struct s y;
> memset(&y, 2, sizeof(struct s));
>
> f(&y, &x);
>
> for (unsigned char *p = (unsigned char *)&y; p < (unsigned char *)&y +
> sizeof(struct s); p++)
> printf("%d", *p);
> printf("\n");
> }
> ----------------------------------------------------------------------
>
> Results:
>
> ----------------------------------------------------------------------
> $ gcc -std=c11 -pedantic -Wall -Wextra test.c && ./a.out
> 11111111
> $ gcc -std=c11 -pedantic -Wall -Wextra -O3 test.c && ./a.out
> 12221111
> ----------------------------------------------------------------------
>
> gcc x86-64 version: gcc (GCC) 10.0.0 20191114 (experimental)
>
>
> But from the C standard POV this case is much more clear: there is no problem
> as stores into a struct make its padding unspecified (C11, 6.2.6.1p6). OTOH
> this sample demonstrates the problem with trunc, so it could be more convenient
> for testing.
Yeah, I think the C standard is clear here but the question is about
GIMPLE IL semantics where making things "unspecified" is a bit awkward.
More information about the Gcc-bugs
mailing list