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