1/* { dg-do run } */
2/* { dg-require-effective-target fpic } */
3/* { dg-options "-O2 -fPIC" } */
4
5void (*pfn)(void);
6
7struct s
8{
9  void** q;
10  int h;
11  int t;
12  int s;
13};
14
15
16void* f (struct s *, struct s *) __attribute__ ((noinline, regparm(1)));
17
18void*
19__attribute__ ((regparm(1)))
20f (struct s *p, struct s *p2)
21{
22  void *gp, *gp1;
23  int t, h, s, t2, h2, c, i;
24
25  if (p2->h == p2->t)
26    return 0;
27
28  (*pfn) ();
29
30  h = p->h;
31  t = p->t;
32  s = p->s;
33
34  h2 = p2->h;
35  t2 = p2->t;
36
37  gp = p2->q[h2++];
38
39  c = (t2 - h2) / 2;
40  for (i = 0; i != c; i++)
41    {
42      if (t == h || (h == 0 && t == s - 1))
43	break;
44      gp1 = p2->q[h2++];
45      p->q[t++] = gp1;
46      if (t == s)
47	t = 0;
48    }
49
50  p2->h = h2;
51  return gp;
52}
53
54static void gn () { }
55
56int
57main()
58{
59  struct s s1, s2;
60  void *q[10];
61
62  pfn = gn;
63
64  s1.q = q;
65  s1.h = 0;
66  s1.t = 2;
67  s1.s = 4;
68
69  s2.q = q;
70  s2.h = 0;
71  s2.t = 4;
72  s2.s = 2;
73
74  f (&s1, &s2);
75
76  return 0;
77}
78