extern void abort (void); extern void *memset (void *s, int c, __SIZE_TYPE__ n); struct S { int i[16]; }; struct S *p; void __attribute__((noinline)) foo(struct S *a, struct S *b) { a->i[0] = -1; p = b; } void test (void) { struct S a, b; memset (&a.i[0], '\0', sizeof (a.i)); memset (&b.i[0], '\0', sizeof (b.i)); foo (&a, &b); *p = a; *p = b; if (b.i[0] != -1) abort (); } int main() { test(); return 0; }
tree DSE removes the *p = a store wrongly. Non-executable testcase: struct S { int i[16]; }; struct S *p; void foo(struct S *, struct S *); void test (void) { struct S a, b; foo (&a, &b); *p = a; *p = b; } -- Summary: [4.3/4.4 Regression] tree DSE is broken Product: gcc Version: 4.3.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rguenth at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35472