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)23enum 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