On Wed, 15 Jun 2016, Bernd Edlinger wrote:
> Hi,
>
> I modified Aexander's test case a bit, and found something
> unexpected, which looks like a GCC-BUG to me:
>
> cat test.c
> #include <string.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> int main()
> {
> long double d0, d;
>
> memcpy(&d0,
> "\x00\x00\x00\x00\x00\x00\x00\x00\xff\x3f\x00\x00\x00\x00\x00\x00", sizeof
> d0);
>
> // d = d0;
> memcpy(&d, &d0, sizeof d0);
> // if (memcmp(&d, &d0, sizeof d))
> // abort();
>
> printf("d = %Lf\n", d);
>
> for (unsigned char *p = (unsigned char *)&d + sizeof d; p > (unsigned char
> *)&d;)
> printf("%02x ", *--p);
> printf("\n");
> }
> // EOF
>
> gcc -O3 test.c && ./a.out
> d = 0.000000
> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>
> but, when I un-comment the memcmp the test case shows the expected
> result:
> d = 0.000000
> 00 00 00 00 00 00 3f ff 00 00 00 00 00 00 00 00
>
> gcc-Version 7.0.0 20160613 (experimental) (GCC)
>
>
> Would'nt you agree, that if we use memcpy it should be possible
> to preserve denormalized or otherwise invalid bit patterns?
> And why should the memcmp have an influence on the memcpy?
I think this is PR71522 which I already fixed on trunk. memcmp
takes the address of the var and by doing that inhibits the broken
transform.
Richard.