/* { dg-do compile } */ /* { dg-options "-O2 -ftree-tail-merge -fdump-tree-pre" } */ struct node { struct node *next; struct node *prev; }; struct node node; struct head { struct node *first; }; struct head heads[5]; int k = 2; struct head *head = &heads[2]; int main () { struct node *p; node.next = (void*)0; node.prev = (void *)head; head->first = &node; struct node *n = head->first; struct head *h = &heads[k]; heads[2].first = n->next; if ((void*)n->prev == (void *)h) p = h->first; else /* Dead tbaa-unsafe load from ((struct node *)&heads[2])->next. */ p = n->prev->next; return !(p == (void*)0); } /* { dg-final { scan-tree-dump-not "Removing basic block" "pre"} } */ /* { dg-final { cleanup-tree-dump "pre" } } */