1 /* { dg-do compile } */
2 /* { dg-options "-O2 -fdump-tree-thread-details-blocks-stats" } */
3 typedef enum STATES {
4 	START=0,
5 	INVALID,
6 	S1,
7 	S2,
8 	INT,
9 	FLOAT ,
10 	EXPONENT,
11 	SCIENTIFIC,
12 	NUM_STATES
13 } state_e ;
14 
15 typedef unsigned char u8;
16 typedef unsigned int  u32;
17 
is_digit(u8 c)18 static u8 is_digit(u8 c) {
19 	return (u8)((c>='0') & (c<='9')) ? 1 : 0;
20 }
21 
FMS(u8 ** in,u32 * transitions)22 enum STATES FMS( u8 **in , u32 *transitions) {
23 	u8 *str = *in;
24 	u8 NEXT_SYMBOL;
25 	enum STATES state=START;
26 	for( ; *str && state != INVALID; str++ ) {
27 		NEXT_SYMBOL = *str;
28 		if (NEXT_SYMBOL==',') /* end of this input */ {
29 			transitions[state]++;
30 			str++;
31 			break;
32 		}
33 		switch(state) {
34 		case START:
35 			if(is_digit(NEXT_SYMBOL)) {
36 				state = INT;
37 			}
38 			else if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
39 				state = S1;
40 			}
41 			else if( NEXT_SYMBOL == '.' ) {
42 				state = FLOAT ;
43 			}
44 			else {
45 				state = INVALID;
46 			}
47 			transitions[START]++;
48 			break;
49 		case S1:
50 			if(is_digit(NEXT_SYMBOL)) {
51 				state = INT;
52 				transitions[S1]++;
53 			}
54 			else if( NEXT_SYMBOL == '.' ) {
55 				state = FLOAT ;
56 				transitions[S1]++;
57 			}
58 			else {
59 				state = INVALID;
60 				transitions[S1]++;
61 			}
62 			break;
63 		case INT:
64 			if( NEXT_SYMBOL == '.' ) {
65 				state = FLOAT ;
66 				transitions[INT]++;
67 			}
68 			else if(!is_digit(NEXT_SYMBOL)) {
69 				state = INVALID;
70 				transitions[INT]++;
71 			}
72 			break;
73 		case FLOAT :
74 			if( NEXT_SYMBOL == 'E' || NEXT_SYMBOL == 'e' ) {
75 				state = S2;
76 				transitions[FLOAT ]++;
77 			}
78 			else if(!is_digit(NEXT_SYMBOL)) {
79 				state = INVALID;
80 				transitions[FLOAT ]++;
81 			}
82 			break;
83 		case S2:
84 			if( NEXT_SYMBOL == '+' || NEXT_SYMBOL == '-' ) {
85 				state = EXPONENT;
86 				transitions[S2]++;
87 			}
88 			else {
89 				state = INVALID;
90 				transitions[S2]++;
91 			}
92 			break;
93 		case EXPONENT:
94 			if(is_digit(NEXT_SYMBOL)) {
95 				state = SCIENTIFIC;
96 				transitions[EXPONENT]++;
97 			}
98 			else {
99 				state = INVALID;
100 				transitions[EXPONENT]++;
101 			}
102 			break;
103 		case SCIENTIFIC:
104 			if(!is_digit(NEXT_SYMBOL)) {
105 				state = INVALID;
106 			}
107 			break;
108 		default:
109 			break;
110 		}
111 	}
112 	if (state==INVALID)
113 		transitions[INVALID]++;
114 
115 	*in = str;
116 	return state;
117 }
118 
119 /* The profile is not updated perfectly because it is inconsitent from
120    profile estimation stage. But the number of inconsistencies should not
121    increase much.  */
122 /* { dg-final { scan-tree-dump "Jumps threaded: 1\[1-9\]" "thread1" } } */
123 /* { dg-final { scan-tree-dump-times "Invalid sum" 3 "thread1" } } */
124 /* { dg-final { scan-tree-dump-not "not considered" "thread1" } } */
125 /* { dg-final { scan-tree-dump-not "not considered" "thread2" } } */
126 /* { dg-final { scan-tree-dump-not "not considered" "thread3" } } */
127 /* { dg-final { scan-tree-dump-not "not considered" "thread4" } } */
128