Commit 4c07fd98 by Dominik Vogt Committed by Andreas Krebbel

S/390: Fix pr67443.c.

The attached patch rewrites the pr67443.c testcase in a different way
so that the test still works with the changed allocation of globals
pinned to registers.  The test ist hopefully more robust now.

gcc/testsuite/ChangeLog:

2016-07-20  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	* gcc.target/s390/pr67443.c: Fix test case.

From-SVN: r238531
parent fee21d65
2016-07-20 Dominik Vogt <vogt@linux.vnet.ibm.com> 2016-07-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/pr67443.c: Fix test case.
2016-07-20 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/insv-1.c: Xfail some tests. * gcc.target/s390/insv-1.c: Xfail some tests.
* gcc.target/s390/insv-2.c: Likewise. * gcc.target/s390/insv-2.c: Likewise.
......
...@@ -2,21 +2,10 @@ ...@@ -2,21 +2,10 @@
/* { dg-do run { target s390*-*-* } } */ /* { dg-do run { target s390*-*-* } } */
/* { dg-prune-output "call-clobbered register used for global register variable" } */ /* { dg-prune-output "call-clobbered register used for global register variable" } */
/* { dg-options "-march=z900 -fPIC -fomit-frame-pointer -O3" } */ /* { dg-options "-march=z900 -fPIC -fomit-frame-pointer -O3 -save-temps" } */
#include <assert.h> #include <assert.h>
/* Block all registers except the first three argument registers. */
register long r0 asm ("r0");
register long r1 asm ("r1");
register long r5 asm ("r5");
register long r6 asm ("r6");
register long r7 asm ("r7");
register long r8 asm ("r8");
register long r9 asm ("r9");
register long r10 asm ("r10");
register long r11 asm ("r11");
struct s_t struct s_t
{ {
unsigned f1 : 8; unsigned f1 : 8;
...@@ -24,25 +13,40 @@ struct s_t ...@@ -24,25 +13,40 @@ struct s_t
}; };
__attribute__ ((noinline)) __attribute__ ((noinline))
void foo (struct s_t *ps, int c, int i) int bar ()
{ {
return 0;
}
__attribute__ ((noinline))
void foo (struct s_t *ps, int c)
{
int tmp;
/* Uses r2 as address register. */ /* Uses r2 as address register. */
ps->f1 = c; ps->f1 = c;
/* The calculation of the value is so expensive that it's cheaper to spill ps /* Clobber all registers that r2 could be stored into. */
to the stack and reload it later (into a different register). __asm__ __volatile__ ("" : : : "memory",
==> Uses r4 as address register.*/ "r0","r1","r6","r7","r8","r9","r10","r11");
ps->f2 = i + i % 3; /* Force that the pointer is evicted from r2 and stored on the stack. */
tmp = bar ();
/* User the pointer again. It gets reloaded to a different register because
r2 is already occupied. */
ps->f2 = tmp;
/* If dead store elimination fails to detect that the address in r2 during /* If dead store elimination fails to detect that the address in r2 during
the first assignment is an alias of the address in r4 during the second the first assignment is an alias of the address in rX during the second
assignment, it eliminates the first assignment and the f1 field is not assignment, it eliminates the first assignment and the f1 field is not
written (bug). */ written (bug). */
} }
/* Make sure that r2 is used only once as an address register for storing.
If this check fails, the test case needs to be fixed.
{ dg-final { scan-assembler-times "\tst.\?\t.*,0\\(%r2\\)" 1 } } */
int main (void) int main (void)
{ {
struct s_t s = { 0x01u, 0x020304u }; struct s_t s = { 0x01u, 0x020304u };
foo (&s, 0, 0); foo (&s, 0);
assert (s.f1 == 0&& s.f2 == 0); assert (s.f1 == 0&& s.f2 == 0);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment