[PATCH 2/2] selftests/powerpc: benchmarks/context_switch.c use vector instructions/types

Christophe Leroy christophe.leroy at c-s.fr
Wed Jan 23 19:47:11 AEDT 2019


Hi Cyril,

On 03/03/2016 11:06 PM, Cyril Bur wrote:
> Currently it doesn't appear the resulting binary actually uses any Altivec
> or VSX instructions the solution is to explicitly tell GCC to use vector
> instructions and use vector types in the code.
> 
> Part of this this issue can be GCC version specific:
> 
> GCC 4.9.x is happy to use Altivec and VSX instructions if altivec.h is
> includedi (and possibly if vector types are used), this also means that
> 4.9.x will use VSX instructions even if only -maltivec is passed. It is
> also possible that Altivec instructions will be used even without -maltivec
> or -mabi=altivec.
> 
> GCC 5.2.x complains about the lack of -maltivec parameter if altivec.h is
> included and will not use VSX unless -mvsx is present on commandline.
> 
> GCC 5.3.0 has a regression that means __attribute__((__target__("no-vsx"))
> fails to build. A fix is targeted for 5.4.
> 
> Furthermore LTO (Link Time Optimisation) doesn't play well with
> __attribute__((__target__("no-vsx")), LTO can cause GCC to forget about the
> attribute and compile with VSX instructions regardless. Be weary when
> enabling -flfo for this test.
> 
> Signed-off-by: Cyril Bur <cyrilbur at gmail.com>

This patch breaks the build on my setup:

ppc-linux-gcc -std=gnu99 -O2 -Wall -Werror 
-DGIT_VERSION='"v5.0-rc3-560-ge0ce62731d77"' 
-I/root/linux-powerpc/tools/testing/selftests/powerpc/include  -O2 
-maltivec -mvsx -mabi=altivec    context_switch.c ../harness.c 
../utils.c -lpthread -o 
/root/linux-powerpc/tools/testing/selftests/powerpc/benchmarks/context_switch
context_switch.c:1:0: error: -mvsx requires hardware floating point 
[-Werror]
  /*
  ^
cc1: all warnings being treated as errors
../harness.c:1:0: error: -mvsx requires hardware floating point [-Werror]
  /*
  ^
cc1: all warnings being treated as errors
../utils.c:1:0: error: -mvsx requires hardware floating point [-Werror]
  /*
  ^
cc1: all warnings being treated as errors
make[1]: *** 
[/root/linux-powerpc/tools/testing/selftests/powerpc/benchmarks/context_switch] 
Error 1


By removing the -mvsx option, it compiles just fine.

Is that option really required ? According to gcc doc, it is 
automatically selected when compiling for cpus that support it.

I'm using:

[root at po16846vm linux-powerpc]# ppc-linux-gcc -v
Using built-in specs.
COLLECT_GCC=ppc-linux-gcc
COLLECT_LTO_WRAPPER=/opt/cldk-1.4.0/libexec/gcc/ppc-linux/5.4.0/lto-wrapper
Target: ppc-linux
Configured with: /root/cldk/gcc-5.4.0/configure --target=ppc-linux 
--with-headers=yes --with-cpu=860 --prefix=/opt/cldk-1.4.0 
--bindir=/opt/cldk-1.4.0/bin --sbindir=/opt/cldk-1.4.0/sbin 
--libexecdir=/opt/cldk-1.4.0/libexec --datadir=/opt/cldk-1.4.0/share 
--sysconfdir=/opt/cldk-1.4.0/etc --libdir=/opt/cldk-1.4.0/lib 
--includedir=/opt/cldk-1.4.0/usr/include 
--oldincludedir=/opt/cldk-1.4.0/usr/include 
--infodir=/opt/cldk-1.4.0/share/info --mandir=/opt/cldk-1.4.0/share/man 
--with-glibc-version=2.18 --enable-languages=c,c++
Thread model: posix
gcc version 5.4.0 (GCC)


Christophe

> ---
>   tools/testing/selftests/powerpc/benchmarks/Makefile         |  1 +
>   tools/testing/selftests/powerpc/benchmarks/context_switch.c | 11 ++++++++---
>   2 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/testing/selftests/powerpc/benchmarks/Makefile b/tools/testing/selftests/powerpc/benchmarks/Makefile
> index 912445f..6816fc2 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/Makefile
> +++ b/tools/testing/selftests/powerpc/benchmarks/Makefile
> @@ -7,6 +7,7 @@ all: $(TEST_PROGS)
>   $(TEST_PROGS): ../harness.c
>   
>   context_switch: ../utils.c
> +context_switch: CFLAGS += -maltivec -mvsx -mabi=altivec
>   context_switch: LDLIBS += -lpthread
>   
>   include ../../lib.mk
> diff --git a/tools/testing/selftests/powerpc/benchmarks/context_switch.c b/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> index e6af382..a36883a 100644
> --- a/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> +++ b/tools/testing/selftests/powerpc/benchmarks/context_switch.c
> @@ -25,7 +25,9 @@
>   #include <sys/types.h>
>   #include <sys/shm.h>
>   #include <linux/futex.h>
> -
> +#ifdef __powerpc__
> +#include <altivec.h>
> +#endif
>   #include "../utils.h"
>   
>   static unsigned int timeout = 30;
> @@ -37,12 +39,15 @@ static int touch_fp = 1;
>   double fp;
>   
>   static int touch_vector = 1;
> -typedef int v4si __attribute__ ((vector_size (16)));
> -v4si a, b, c;
> +vector int a, b, c;
>   
>   #ifdef __powerpc__
>   static int touch_altivec = 1;
>   
> +/*
> + * Note: LTO (Link Time Optimisation) doesn't play well with this function
> + * attribute. Be very careful enabling LTO for this test.
> + */
>   static void __attribute__((__target__("no-vsx"))) altivec_touch_fn(void)
>   {
>   	c = a + b;
> 


More information about the Linuxppc-dev mailing list