diff options
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr43139.c')
-rw-r--r-- | gcc/testsuite/gcc.dg/pr43139.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr43139.c b/gcc/testsuite/gcc.dg/pr43139.c new file mode 100644 index 00000000000..4dc725bcc9d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr43139.c @@ -0,0 +1,59 @@ +/* PR target/43139 */ +/* { dg-do compile { target fpic } } */ +/* { dg-options "-g -O2 -fpic" } */ + +typedef double T1[10]; +typedef double T2[10][10]; +typedef int T3[10]; + +void __attribute__((noinline)) +fn1 (void) +{ + asm volatile ("" : : : "memory"); +} + +void __attribute__((noinline)) +fn2 (int x, ...) +{ + asm volatile ("" : : "r" (x) : "memory"); +} + +static void +bar (double v, double w, double x, double y, double z) +{ + double a; + if (v / w < 200.0) + { + a = x + (y - x) * __builtin_exp (-v / w); + fn2 (0); + fn2 (1, a * 20.2 / z, z); + fn1 (); + } +} + +static void +baz (T2 u, T2 v, T2 t, T2 x, T1 y, T3 z, double q, int j, int k) +{ + int i = z[k]; + if (u[i][j] > 0.0) + bar (q, x[i][j], v[i][j], t[i][j], y[i]); +} + +static T2 a, b, c, d; +static T1 e; +static T3 f; + +void __attribute__((noinline)) +test (int j, int k, double q) +{ + baz (a, b, c, d, e, f, q, j, k); +} + +int +main (void) +{ + d[0][6] = 1.0; + a[0][6] = 2.0; + test (6, 7, 400.0); + return 0; +} |