1 /* PR tree-optimization/20601 */
2 /* { dg-xfail-if "ptxas crashes" { nvptx-*-* } { "-O1" } { "" } } */
3 extern void abort (void);
4 extern void exit (int);
5
6 struct T
7 {
8 char *t1;
9 char t2[4096];
10 char **t3;
11 };
12
13 int a[5];
14 int b;
15 char **c;
16 int d;
17 char **e;
18 struct T t;
19 char *f[16];
20 char *g[] = { "a", "-u", "b", "c" };
21
22 __attribute__ ((__noreturn__)) void
foo(void)23 foo (void)
24 {
25 while (1);
26 }
27
28 __attribute__ ((noinline)) char *
bar(char * x,unsigned int y)29 bar (char *x, unsigned int y)
30 {
31 return 0;
32 }
33
34 static inline char *
baz(char * x,unsigned int y)35 baz (char *x, unsigned int y)
36 {
37 if (sizeof (t.t2) != (unsigned int) -1 && y > sizeof (t.t2))
38 foo ();
39 return bar (x, y);
40 }
41
42 static inline int
setup1(int x)43 setup1 (int x)
44 {
45 char *p;
46 int rval;
47
48 if (!baz (t.t2, sizeof (t.t2)))
49 baz (t.t2, sizeof (t.t2));
50
51 if (x & 0x200)
52 {
53 char **h, **i = e;
54
55 ++d;
56 e = f;
57 if (t.t1 && *t.t1)
58 e[0] = t.t1;
59 else
60 abort ();
61
62 for (h = e + 1; (*h = *i); ++i, ++h)
63 ;
64 }
65 return 1;
66 }
67
68 static inline int
setup2(void)69 setup2 (void)
70 {
71 int j = 1;
72
73 e = c + 1;
74 d = b - 1;
75 while (d > 0 && e[0][0] == '-')
76 {
77 if (e[0][1] != '\0' && e[0][2] != '\0')
78 abort ();
79
80 switch (e[0][1])
81 {
82 case 'u':
83 if (!e[1])
84 abort ();
85
86 t.t3 = &e[1];
87 d--;
88 e++;
89 break;
90 case 'P':
91 j |= 0x1000;
92 break;
93 case '-':
94 d--;
95 e++;
96 if (j == 1)
97 j |= 0x600;
98 return j;
99 }
100 d--;
101 e++;
102 }
103
104 if (d > 0 && !(j & 1))
105 abort ();
106
107 return j;
108 }
109
110 int
main(void)111 main (void)
112 {
113 int x;
114 c = g;
115 b = 4;
116 x = setup2 ();
117 t.t1 = "/bin/sh";
118 setup1 (x);
119 /* PRE shouldn't transform x into the constant 0x601 here, it's not legal. */
120 if ((x & 0x400) && !a[4])
121 abort ();
122 exit (0);
123 }
124