|  | /* { 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; | 
|  |  | 
|  | asm("":"=m"(node.prev)); | 
|  |  | 
|  | 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"} } */ |