From e7ef9a40cd0c688cd331bc26224d1fbe360c1fe6 Mon Sep 17 00:00:00 2001 From: "Vladimir N. Makarov" Date: Thu, 4 Jun 2020 13:32:24 -0400 Subject: [PATCH] Add test for PR95464.c. 2020-06-04 Vladimir Makarov PR middle-end/95464 * gcc.target/i386/pr95464.c: New. --- gcc/testsuite/gcc.target/i386/pr95464.c | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr95464.c diff --git a/gcc/testsuite/gcc.target/i386/pr95464.c b/gcc/testsuite/gcc.target/i386/pr95464.c new file mode 100644 index 00000000000..33a8290e0cf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr95464.c @@ -0,0 +1,64 @@ +/* { dg-options "-O2" } */ +/* { dg-do run { target { { *-*-linux* } && { ! ia32 } } } } */ + +struct S { unsigned a:1, b:1, c:1, d:1, e:14, f:14; }; + +__attribute__((noipa)) int +foo (struct S x) +{ + if (x.a != 0 || x.b != 1 || x.c != 0 || x.d != 1 + || x.e != 7239 || x.f != 6474) + __builtin_abort (); +} + +__attribute__((noipa)) void +bar (struct S x, struct S y) +{ + if (x.a != 0 || x.b != 1 || x.c != 0 || x.d != 1 + || x.e != 7239 || x.f != 6474) + __builtin_abort (); + if (y.a != 0 || y.b != 1 || y.c != 1 || y.d != 1 + || y.e != 16320 || y.f != 7315) + __builtin_abort (); +} + +__attribute__((noipa)) void +baz (struct S x) +{ + if (x.a != 1 || x.b != 1 || x.c != 1 || x.d != 1 + || x.e != 16320 || x.f != 7315) + __builtin_abort (); +} + +__attribute__((noipa)) void +qux (struct S x, struct S y, unsigned z) +{ + struct S a = x, b; + for (unsigned i = 0; i < z; ++i) + foo (x); + if (x.a && x.e == 16) + a.e = 32; + b = a; + b.c = y.c; + b.e = y.e; + b.f = y.f; + bar (a, b); + a = b; + __asm volatile ("" : : : "ax", "bx", "cx", "dx", "si", "di", +#ifdef __OPTIMIZE__ + "bp", +#endif + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); + a.a = 1; + a.c = 1; + baz (a); +} + +int +main () +{ + struct S x = { 0, 1, 0, 1, 7239, 6474 }; + struct S y = { 1, 0, 1, 0, 16320, 7315 }; + qux (x, y, 1); + return 0; +} -- 2.30.2