1/* PR tree-optimization/20100
2   Pure function being treated as const.
3   Author: Hans-Peter Nilsson.  */
4
5static unsigned short g = 0;
6static unsigned short p = 0;
7unsigned char e;
8
9static unsigned short
10next_g (void)
11{
12  return g == e - 1 ? 0 : g + 1;
13}
14
15static unsigned short
16curr_p (void)
17{
18  return p;
19}
20
21static unsigned short
22inc_g (void)
23{
24  return g = next_g ();
25}
26
27static unsigned short
28curr_g (void)
29{
30  return g;
31}
32
33static char
34ring_empty (void)
35{
36  if (curr_p () == curr_g ())
37    return 1;
38  else
39    return 0;
40}
41
42char
43frob (unsigned short a, unsigned short b)
44{
45  g = a;
46  p = b;
47  inc_g ();
48  return ring_empty ();
49}
50
51unsigned short
52get_n (void)
53{
54  unsigned short n = 0;
55  unsigned short org_g;
56  org_g = curr_g ();
57  while (!ring_empty () && n < 5)
58    {
59      inc_g ();
60      n++;
61    }
62
63  return n;
64}
65
66void abort (void);
67void exit (int);
68int main (void)
69{
70  e = 3;
71  if (frob (0, 2) != 0 || g != 1 || p != 2 || e != 3
72      || get_n () != 1
73      || g != 2 || p != 2)
74    abort ();
75  exit (0);
76}
77