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