Remove old autovect-branch by moving to "dead" directory.
[official-gcc.git] / old-autovect-branch / gcc / testsuite / gcc.c-torture / execute / pr17377.c
blob0be6f0a849e92cc60b64fb71b2f24c2c8f03a9be
1 /* PR target/17377
2 Bug in code emitted by "return" pattern on CRIS: missing pop of
3 forced return address on stack. */
4 int calls = 0;
6 void *f (int) __attribute__ ((__noinline__));
7 void *
8 f (int i)
10 /* The code does a little brittle song and dance to trig the "return"
11 pattern instead of the function epilogue. This must still be a
12 leaf function for the bug to be exposed. */
14 if (calls++ == 0)
15 return __builtin_return_address (0);
17 switch (i)
19 case 1:
20 return f;
21 case 0:
22 return __builtin_return_address (0);
24 return 0;
27 int x;
29 void *y (int i) __attribute__ ((__noinline__));
30 void *
31 y (int i)
33 x = 0;
35 /* This must not be a sibling call: the return address must appear
36 constant for different calls to this function. Postincrementing x
37 catches otherwise unidentified multiple returns (e.g. through the
38 return-address register and then this epilogue popping the address
39 stored on stack in "f"). */
40 return (char *) f (i) + x++;
43 int
44 main (void)
46 void *v = y (4);
47 if (y (1) != f
48 /* Can't reasonably check the validity of the return address
49 above, but it's not that important: the test-case will probably
50 crash on the first call to f with the bug present, or it will
51 run wild including returning early (in y or here), so we also
52 try and check the number of calls. */
53 || y (0) != v
54 || y (3) != 0
55 || y (-1) != 0
56 || calls != 5)
57 abort ();
58 exit (0);