libcpp/expr.c is miscompiled when compiled with gcc-4_0-branch GCC on x86-64 (and likely i386 as well). expr.c miscompiled that way causes a testsuite regression on arith-3.c: FAIL: gcc.dg/cpp/arith-3.c (test for bogus messages, line 257)
Self-contained testcase that reproduces the problem is: extern void abort (void); typedef unsigned long long T; typedef struct { T a, b; unsigned char c, d; } S; #define M (sizeof (T) * 4) S __attribute__((noinline)) foo (T x, T y) { S e; T f[2], g; e.b = (x & (~(T) 0 >> M)) * (y & (~(T) 0 >> M)); e.a = (x >> M) * (y >> M); f[0] = (x & (~(T) 0 >> M)) * (y >> M); f[1] = (x >> M) * (y & (~(T) 0 >> M)); g = e.b; e.b += (f[0] & (~(T) 0 >> M)) << M; if (e.b < g) e.a++; g = e.b; e.b += (f[1] & (~(T) 0 >> M)) << M; if (e.b < g) e.a++; e.a += (f[0] >> M); e.a += (f[1] >> M); e.c = 1; e.d = 0; return e; } int main (void) { T x = 1ULL << (M * 2 - 1); S y = foo (1, x); if (y.a || y.b != x || y.c != 1 || y.d) abort (); return 0; } -- Summary: Miscompilation of libcpp/expr.c at -O2+ Product: gcc Version: 4.0.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org GCC target triplet: x86_64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20322