1/* { dg-do run } */
2/* { dg-options "-O2" } */
3
4void abort ();
5
6typedef struct _Node
7{
8  struct _Node *next, *prev;
9} Node;
10
11void __attribute__ ((noinline)) append (Node * q, Node * p)
12{
13  p->next = q;
14  p->prev = q;
15  q->next = p;
16  q->prev = p;
17}
18
19inline void
20swap (Node ** a, Node ** b)
21{
22  Node *tmp = *a;
23  *a = *b;
24  *b = tmp;
25}
26
27/* Miscompilation seems to happen here. If one removes the if condition
28   (which should be true) the program works fine.  */
29void
30ListSwap (Node * x, Node * y)
31{
32  Node *tmp;
33  if (x->next)
34    {
35      swap (&x->next, &y->next);
36      swap (&x->prev, &y->prev);
37      x->next->prev = x->prev->next = x;
38      y->next->prev = y->prev->next = y;
39    }
40}
41
42int
43main ()
44{
45  Node A, A1, B, B1;
46
47  append (&A, &A1);
48  append (&B, &B1);
49
50  ListSwap (&A, &B);
51
52  if (&A != A.next->prev)
53    abort ();
54
55  return 0;
56}
57