modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20071210-1.c (about) 1 /* PR rtl-optimization/34302 */ 2 /* { dg-require-effective-target label_values } */ 3 /* { dg-require-effective-target indirect_jumps } */ 4 5 extern void abort (void); 6 7 struct S 8 { 9 int n1, n2, n3, n4; 10 }; 11 12 __attribute__((noinline)) struct S 13 foo (int x, int y, int z) 14 { 15 if (x != 10 || y != 9 || z != 8) 16 abort (); 17 struct S s = { 1, 2, 3, 4 }; 18 return s; 19 } 20 21 __attribute__((noinline)) void ** 22 bar (void **u, int *v) 23 { 24 void **w = u; 25 int *s = v, x, y, z; 26 void **p, **q; 27 static void *l[] = { &&lab1, &&lab1, &&lab2, &&lab3, &&lab4 }; 28 29 if (!u) 30 return l; 31 32 q = *w++; 33 goto *q; 34 lab2: 35 p = q; 36 q = *w++; 37 x = s[2]; 38 y = s[1]; 39 z = s[0]; 40 s -= 1; 41 struct S r = foo (x, y, z); 42 s[3] = r.n1; 43 s[2] = r.n2; 44 s[1] = r.n3; 45 s[0] = r.n4; 46 goto *q; 47 lab3: 48 p = q; 49 q = *w++; 50 s += 1; 51 s[0] = 23; 52 lab1: 53 goto *q; 54 lab4: 55 return 0; 56 } 57 58 int 59 main (void) 60 { 61 void **u = bar ((void **) 0, (int *) 0); 62 void *t[] = { u[2], u[4] }; 63 int s[] = { 7, 8, 9, 10, 11, 12 }; 64 if (bar (t, &s[1]) != (void **) 0 65 || s[0] != 4 || s[1] != 3 || s[2] != 2 || s[3] != 1 66 || s[4] != 11 || s[5] != 12) 67 abort (); 68 return 0; 69 }