[Bug middle-end/29272] [4.2 Regression] memcpy optimization causes wrong-code
rguenth at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Fri Sep 29 09:14:00 GMT 2006
------- Comment #4 from rguenth at gcc dot gnu dot org 2006-09-29 09:14 -------
Here's an executable testcase which is miscompiled at the tree-level.
extern void abort(void);
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 main()
{
grow();
struct Foo* foo = alloc_one();
foo->a = 0;
foo->b = -1;
dealloc_one (foo);
if (foo->b == -1)
abort ();
return 0;
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29272
More information about the Gcc-bugs
mailing list