The simple code below: ============================== #include <stdio.h> #include <stdint.h>
#define ppc_mask64(n) ((n) == 64 ? (-1LL) : (1LL << (n)) - 1) uint64_t ppc_set_field64u(uint64_t v, uint64_t s, int32_t u, int32_t l) { uint64_t mask = ppc_mask64(u - l + 1) << l; return (v & ~mask) | ((s << l) & mask); } double ppc_set_fieldd(double v, uint64_t s, int32_t u, int32_t l) { double x; *((uint64_t *)&x) = ppc_set_field64u(*((uint64_t *)&v), s, u, l); return x; } double ppc_set_fieldd_bug(double v, uint64_t s, int32_t u, int32_t l) { *((uint64_t *)&v) = ppc_set_field64u(*((uint64_t *)&v), s, u, l); return v; } int main(void) { double x = 1.1, y, z; printf("%016Lx\n", *(uint64_t *)&x); y = ppc_set_fieldd(x, 0xff, 31, 24); printf("%016Lx\n", *(uint64_t *)&y); z = ppc_set_fieldd_bug(x, 0xff, 31, 24); printf("%016Lx\n", *(uint64_t *)&z); } ==================== produces with -O2 or -O3 : 3ff199999999999a 3ff19999ff99999a 3ff199999999999a while it should produces (no optimization or -O): 3ff199999999999a 3ff19999ff99999a 3ff19999ff99999a -- Summary: Bad generated code with integer/float pointer cast assignment and with optimization. Product: gcc Version: 4.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: casse at irit dot fr GCC build triplet: i486-linux-elf GCC host triplet: i486-linux-elf GCC target triplet: i486-linux-elf http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43982