From e1617c1d3837a5d914a6bfd6b01f46c941d0caca Mon Sep 17 00:00:00 2001 From: Yury Gribov Date: Fri, 16 Feb 2018 20:38:14 +0000 Subject: [PATCH] Fix PowerPC tests in PR 81535. gcc/testsuite/ 2018-02-16 Yury Gribov PR target/81535 * gcc.dg/pr56727-1.c: Prevent tailcalls and update for powerpc*-*-*. * gcc.dg/pr56727-2.c: Ditto. * gcc.target/powerpc/pr79439.c: Renamed to... * gcc.target/powerpc/pr79439-1.c: ...this. * gcc.target/powerpc/pr79439-2.c: New test. * gcc.target/powerpc/pr79439-3.c: New test. From-SVN: r257760 --- gcc/testsuite/ChangeLog | 10 +++++++ gcc/testsuite/gcc.dg/pr56727-1.c | 5 +++- gcc/testsuite/gcc.dg/pr56727-2.c | 6 +++- gcc/testsuite/gcc.target/powerpc/pr79439-1.c | 28 +++++++++++++++++++ .../powerpc/{pr79439.c => pr79439-2.c} | 10 ++++--- gcc/testsuite/gcc.target/powerpc/pr79439-3.c | 25 +++++++++++++++++ 6 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr79439-1.c rename gcc/testsuite/gcc.target/powerpc/{pr79439.c => pr79439-2.c} (69%) create mode 100644 gcc/testsuite/gcc.target/powerpc/pr79439-3.c diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9cd3b397235..1604854d886 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2018-02-16 Yury Gribov + + PR target/81535 + * gcc.dg/pr56727-1.c: Prevent tailcalls and update for powerpc*-*-*. + * gcc.dg/pr56727-2.c: Ditto. + * gcc.target/powerpc/pr79439.c: Renamed to... + * gcc.target/powerpc/pr79439-1.c: ...this. + * gcc.target/powerpc/pr79439-2.c: New test. + * gcc.target/powerpc/pr79439-3.c: New test. + 2018-02-16 Will Schmidt target/pr84371 diff --git a/gcc/testsuite/gcc.dg/pr56727-1.c b/gcc/testsuite/gcc.dg/pr56727-1.c index ffc133545e7..a26edb2bf9b 100644 --- a/gcc/testsuite/gcc.dg/pr56727-1.c +++ b/gcc/testsuite/gcc.dg/pr56727-1.c @@ -1,6 +1,5 @@ /* { dg-do compile { target fpic } } */ /* { dg-options "-O2 -fPIC" } */ -/* { dg-final { scan-assembler-not "@(PLT|plt)" { target i?86-*-* x86_64-*-* powerpc*-*-* } } } */ #define define_func(type) \ void f_ ## type (type b) { f_ ## type (0); } \ @@ -21,3 +20,7 @@ int __attribute__((noinline, noclone)) foo_noinline(int n) { return (n == 1 || n == 2) ? 1 : foo_noinline(n-1) * foo_noinline(n-2); } + +/* { dg-final { scan-assembler-not "@(PLT|plt)" { target i?86-*-* x86_64-*-* } } } */ +/* { dg-final { scan-assembler-not "@(PLT|plt)" { target { powerpc*-*-* && ilp32 } } } } */ +/* { dg-final { scan-assembler-not "bl \[a-z_\]*\n\\s*nop" { target { powerpc*-*-* && lp64 } } } } */ diff --git a/gcc/testsuite/gcc.dg/pr56727-2.c b/gcc/testsuite/gcc.dg/pr56727-2.c index 62a74d1ea31..c54369ed25e 100644 --- a/gcc/testsuite/gcc.dg/pr56727-2.c +++ b/gcc/testsuite/gcc.dg/pr56727-2.c @@ -1,11 +1,11 @@ /* { dg-do compile { target fpic } } */ /* { dg-options "-O2 -fPIC" } */ /* { dg-require-alias "" } */ -/* { dg-final { scan-assembler "@(PLT|plt)" { target i?86-*-* x86_64-*-* powerpc*-*-linux* } } } */ __attribute__((noinline, noclone)) void f (short b) { + __builtin_setjmp (0); /* Prevent tailcall */ f (0); } @@ -15,3 +15,7 @@ void h () { g (0); } + +/* { dg-final { scan-assembler "@(PLT|plt)" { target i?86-*-* x86_64-*-* } } } */ +/* { dg-final { scan-assembler "@(PLT|plt)" { target { powerpc*-*-linux* && ilp32 } } } } */ +/* { dg-final { scan-assembler "bl f\n\\s*nop" { target { powerpc*-*-linux* && lp64 } } } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr79439-1.c b/gcc/testsuite/gcc.target/powerpc/pr79439-1.c new file mode 100644 index 00000000000..5732a236c8e --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr79439-1.c @@ -0,0 +1,28 @@ +/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ +/* { dg-options "-O2 -fpic -fno-reorder-blocks" } */ + +/* On the Linux 64-bit ABIs, we eliminate NOP in the 'rec' call even if + -fpic is used. The recursive call should call the local alias. The + Linux 32-bit ABIs do not require NOPs after the BL instruction. */ + +int f (void); + +void +g (void) +{ +} + +int +rec (int a) +{ + int ret = 0; + if (a > 10 && f ()) + ret += rec (a - 1); + g (); + return a + ret; +} + +/* { dg-final { scan-assembler-times {\mbl f\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mbl g\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mbl rec\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mnop\M} 2 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr79439.c b/gcc/testsuite/gcc.target/powerpc/pr79439-2.c similarity index 69% rename from gcc/testsuite/gcc.target/powerpc/pr79439.c rename to gcc/testsuite/gcc.target/powerpc/pr79439-2.c index 23c9a24fdc3..b53af445265 100644 --- a/gcc/testsuite/gcc.target/powerpc/pr79439.c +++ b/gcc/testsuite/gcc.target/powerpc/pr79439-2.c @@ -1,9 +1,9 @@ -/* { dg-do compile { target { powerpc64*-*-linux* && lp64 } } } */ -/* { dg-options "-O2 -fpic" } */ +/* { dg-do compile { target { powerpc*-*-linux* && lp64 } } } */ +/* { dg-options "-O2 -fpic -fno-reorder-blocks" } */ /* On the Linux 64-bit ABIs, we should not eliminate NOP in the 'rec' call if - -fpic is used because rec can be interposed at link time (since it is - external), and the recursive call should call the interposed function. The + -fpic is used because rec can be interposed at link time (since it has an + alias), and the recursive call should call the interposed function. The Linux 32-bit ABIs do not require NOPs after the BL instruction. */ int f (void); @@ -23,6 +23,8 @@ rec (int a) return a + ret; } +int rec_alias (int) __attribute__ ((alias ("rec"))); + /* { dg-final { scan-assembler-times {\mbl f\M} 1 } } */ /* { dg-final { scan-assembler-times {\mbl g\M} 1 } } */ /* { dg-final { scan-assembler-times {\mbl rec\M} 1 } } */ diff --git a/gcc/testsuite/gcc.target/powerpc/pr79439-3.c b/gcc/testsuite/gcc.target/powerpc/pr79439-3.c new file mode 100644 index 00000000000..762ca44b177 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr79439-3.c @@ -0,0 +1,25 @@ +/* { dg-do compile { target { powerpc-*-linux* && ilp32 } } } */ +/* { dg-options "-O2 -fpic -fno-reorder-blocks" } */ + +/* Analog of pr79439-1.c for 32-bit Linux. */ + +int f (void); + +void +g (void) +{ +} + +int +rec (int a) +{ + int ret = 0; + if (a > 10 && f ()) + ret += rec (a - 1); + g (); + return a + ret; +} + +/* { dg-final { scan-assembler-times {\mbl f@plt\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mbl g@plt\M} 1 } } */ +/* { dg-final { scan-assembler-times {\mbl rec@plt\M} 0 } } */ -- 2.30.2