With the following testcase lowering memcpy to pointer assignment causes wrong alias information to be generated.
struct Foo { int a; int b; }; struct Node; struct Node { struct Node *next; }; struct Node *pool; void grow (void) { char *mem = __builtin_malloc (4096); struct Node *node = (struct Node *)mem; struct Foo *foo; __builtin_memcpy (&node->next, &pool, sizeof(struct Node*)); pool = node; } static inline void *alloc_one (void) { struct Node *node = pool; __builtin_memcpy (&pool, &node->next, sizeof(struct Node*)); return node; } static inline void dealloc_one (void *p) { struct Node *node = p; __builtin_memcpy (&node->next, &pool, sizeof(struct Node*)); pool = node; } int bar(void) { grow(); struct Foo* foo = alloc_one(); foo->a = 0; foo->b = -1; dealloc_one (foo); return foo->a; } while we have in .optimized <bb 2>: grow (); node = pool; D.1928 = node->next; pool = D.1928; foo = (struct Foo *) node; foo->a = 0; foo->b = -1; node = (struct Node *) foo; node->next = D.1928; pool = node; return foo->a; asm generates: bar: .LFB5: subq $8, %rsp .LCFI1: call grow movq pool(%rip), %rax movl $0, (%rax) movl $-1, 4(%rax) xorl %eax, %eax addq $8, %rsp ret which is wrong. -- Summary: [4.2 Regression] memcpy optimization causes wrong-code Product: gcc Version: 4.2.0 Status: UNCONFIRMED Keywords: wrong-code, alias Severity: blocker Priority: P3 Component: middle-end 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=29272