1 /* PR rtl-optimization/69691 */
2 
3 char u[] = { 46, 97, 99, 104, 52, 0 };
4 char *v[] = { u, 0 };
5 struct S { char a[10]; struct S *b[31]; };
6 struct S r[7], *r2 = r;
7 static struct S *w = 0;
8 
9 __attribute__((noinline, noclone)) int
fn(int x)10 fn (int x)
11 {
12   if (__builtin_strchr (u, x) || x == 96)
13     return x;
14   __builtin_abort ();
15 }
16 
17 __attribute__((noinline, noclone)) int
foo(char x)18 foo (char x)
19 {
20   if (x == 0)
21     __builtin_abort ();
22   if (fn (x) >= 96 && fn (x) <= 122)
23     return (fn (x) - 96);
24   else if (x == 46)
25     return 0;
26   else
27     {
28       __builtin_printf ("foo %d\n", x);
29       return -1;
30     }
31 }
32 
33 __attribute__((noinline, noclone)) void
bar(char ** x)34 bar (char **x)
35 {
36   char **b, c, *d, e[500], *f, g[10];
37   int z, l, h, i;
38   struct S *s;
39 
40   w = r2++;
41   for (b = x; *b; b++)
42     {
43       __builtin_strcpy (e, *b);
44       f = e;
45       do
46 	{
47 	  d = __builtin_strchr (f, 32);
48 	  if (d)
49 	    *d = 0;
50 	  l = __builtin_strlen (f);
51 	  h = 0;
52 	  s = w;
53 	  __builtin_memset (g, 0, sizeof (g));
54 	  for (z = 0; z < l; z++)
55 	    {
56 	      c = f[z];
57 	      if (c >= 48 && c <= 57)
58 		g[h] = c - 48;
59 	      else
60 		{
61 		  i = foo (c);
62 		  if (!s->b[i])
63 		    {
64 		      s->b[i] = r2++;
65 		      if (r2 == &r[7])
66 			__builtin_abort ();
67 		    }
68 		  s = s->b[i];
69 		  h++;
70 		}
71 	    }
72 	  __builtin_memcpy (s->a, g, 10);
73 	  if (d)
74 	    f = d + 1;
75 	}
76       while (d);
77     }
78 }
79 
80 __attribute__((noinline, noclone)) void
baz(char * x)81 baz (char *x)
82 {
83   char a[300], b[300];
84   int z, y, t, l;
85   struct S *s;
86 
87   l = __builtin_strlen (x);
88   *a = 96;
89   for (z = 0; z < l; z++)
90     {
91       a[z + 1] = fn ((unsigned int) x[z]);
92       if (foo (a[z + 1]) <= 0)
93 	return;
94     }
95   a[l + 1] = 96;
96   l += 2;
97   __builtin_memset (b, 0, l + 2);
98 
99   if (!w)
100     return;
101 
102   for (z = 0; z < l; z++)
103     {
104       s = w;
105       for (y = z; y < l; y++)
106 	{
107 	  s = s->b[foo (a[y])];
108 	  if (!s)
109 	    break;
110 	  for (t = 0; t <= y - z + 2; t++)
111 	    if (s->a[t] > b[z + t])
112 	      b[z + t] = s->a[t];
113 	}
114     }
115   for (z = 3; z < l - 2; z++)
116     if ((b[z] & 1) == 1)
117      asm ("");
118 }
119 
120 int
main()121 main ()
122 {
123   bar (v);
124   char c[] = { 97, 97, 97, 97, 97, 0 };
125   baz (c);
126   return 0;
127 }
128