Running gcc-4.3 -O2 on PR1386.c I get different results than with -O1. $ gcc-4.3 -O2 PR1386.c && ./a.out PR1386.c: In function main: PR1386.c:15: warning: large integer implicitly truncated to unsigned type PR1386.c:17: warning: large integer implicitly truncated to unsigned type bad bits: fffffffffffffff0 $ gcc-4.3 -O2 PR1386.c && ./a.out PR1386.c: In function main: PR1386.c:15: warning: large integer implicitly truncated to unsigned type PR1386.c:17: warning: large integer implicitly truncated to unsigned type bad bits: fffffffffffffff0
gcc-4.2 is fine: $ gcc-4.2 -O2 PR1386.c && ./a.out PR1386.c: In function main: PR1386.c:15: warning: large integer implicitly truncated to unsigned type PR1386.c:17: warning: large integer implicitly truncated to unsigned type bad bits: 0 $ gcc-4.2 -O3 PR1386.c && ./a.out PR1386.c: In function main: PR1386.c:15: warning: large integer implicitly truncated to unsigned type PR1386.c:17: warning: large integer implicitly truncated to unsigned type bad bits: 0 The file is from an LLVM testcase http://llvm.org/bugs/show_bug.cgi?id=1386 #include <stdio.h> #include <stdint.h> struct X { unsigned char pad : 4; uint64_t a : 64; uint64_t b : 60; } __attribute__((packed)); int main (void) { struct X x; uint64_t bad_bits; x.pad = 255; x.a = -1ULL; x.b = -1ULL; bad_bits = ((uint64_t)-1ULL) ^ *(1+(uint64_t *) &x); printf("bad bits: %llx\n", bad_bits); return bad_bits != 0; } -- Summary: inconsistent results on -O2 when reading bits from packed struct Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: edwintorok at gmail dot com GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37867