1/* { dg-do compile } */
2/* { dg-options "-O2 -fdump-tree-dom1-details" } */
3/* { dg-final { scan-tree-dump-times "FSM" 19 "dom1" } } */
4/* { dg-final { cleanup-tree-dump "dom1" } } */
5
6enum STATE {
7  S0=0,
8  SI,
9  S1,
10  S2,
11  S3,
12  S4,
13  S5,
14  S6
15};
16
17int bar (enum STATE s);
18
19enum STATE foo (unsigned char **y, unsigned *c)
20{
21  unsigned char *x = *y;
22  unsigned char n;
23  enum STATE s = S0;
24
25  for( ; *x && s != SI; x++ )
26    {
27      n = *x;
28      if (n == 'x')
29	{
30	  x++;
31	  break;
32	}
33      switch(s)
34	{
35	case S0:
36	  if(bar(n))
37	    s = S3;
38	  else if( n == 'a' || n == 'b' )
39	    s = S1;
40	  else if( n == 'c' )
41	    s = S4;
42	  else
43	    {
44	      s = SI;
45	      c[SI]++;
46	    }
47	  c[S0]++;
48	  break;
49	case S1:
50	  if(bar(n))
51	    {
52	      s = S3;
53	      c[S1]++;
54	    }
55	  else if( n == 'c' )
56	    {
57	      s = S4;
58	      c[S1]++;
59	    }
60	  else
61	    {
62	      s = SI;
63	      c[S1]++;
64	    }
65	  break;
66	case S3:
67	  if( n == 'c' )
68	    {
69	      s = S4;
70	      c[S3]++;
71	    }
72	  else if(!bar(n))
73	    {
74	      s = SI;
75	      c[S3]++;
76	    }
77	  break;
78	case S4:
79	  if( n == 'E' || n == 'e' )
80	    {
81	      s = S2;
82	      c[S4]++;
83	    }
84	  else if(!bar(n))
85	    {
86	      s = SI;
87	      c[S4]++;
88	    }
89	  break;
90	case S2:
91	  if( n == 'a' || n == 'b' )
92	    {
93	      s = S5;
94	      c[S2]++;
95	    }
96	  else
97	    {
98	      s = SI;
99	      c[S2]++;
100	    }
101	  break;
102	case S5:
103	  if(bar(n))
104	    {
105	      s = S6;
106	      c[S5]++;
107	    }
108	  else
109	    {
110	      s = SI;
111	      c[S5]++;
112	    }
113	  break;
114	case S6:
115	  if(!bar(n))
116	    {
117	      s = SI;
118	      c[SI]++;
119	    }
120	  break;
121	default:
122	  break;
123	}
124    }
125  *y=x;
126  return s;
127}
128