From: Alan Modra Date: Mon, 29 Jan 2018 04:31:18 +0000 (+1030) Subject: [PATCH] PR84033, powerpc64le -moptimize-swaps bad code with vec_vbpermq X-Git-Tag: releases/gcc-6.5.0~556 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=294283102bda8fc1fd6bcb1e3203e9c349a18835;p=thirdparty%2Fgcc.git [PATCH] PR84033, powerpc64le -moptimize-swaps bad code with vec_vbpermq vbpermq produces its output in bits 48..63 of the target vector reg, so the output cannot be lane swapped. gcc/ PR target/84033 * config/rs6000/rs6000.c (rtx_is_swappable_p): Exclude UNSPEC_VBPERMQ. gcc/testsuite/ PR target/84033 * gcc.target/powerpc/swaps-p8-46.c: New. Backport svn r257070 From-SVN: r257137 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f67a8793301..1bb9c6491aa2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-01-29 Alan Modra + + Backport from mainline + 2018-01-26 Alan Modra + PR target/84033 + * config/rs6000/rs6000.c (rtx_is_swappable_p): Exclude + UNSPEC_VBPERMQ. + 2018-01-24 Bill Schmidt Backport from mainline diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 784fdbe254d1..80391acf3cd6 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -38694,6 +38694,7 @@ rtx_is_swappable_p (rtx op, unsigned int *special) { default: break; + case UNSPEC_VBPERMQ: case UNSPEC_VMRGH_DIRECT: case UNSPEC_VMRGL_DIRECT: case UNSPEC_VPACK_SIGN_SIGN_SAT: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6da5bf16f237..273c6cfdeca8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-01-29 Alan Modra + + PR target/84033 + * gcc.target/powerpc/swaps-p8-46.c: New. + 2018-01-23 Peter Bergner Back port from mainline diff --git a/gcc/testsuite/gcc.target/powerpc/swaps-p8-46.c b/gcc/testsuite/gcc.target/powerpc/swaps-p8-46.c new file mode 100644 index 000000000000..23494b695a5a --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/swaps-p8-46.c @@ -0,0 +1,34 @@ +/* { dg-do run { target { powerpc64le-*-* } } } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */ +/* { dg-options "-mcpu=power8 -O2 " } */ + +typedef __attribute__ ((__aligned__ (8))) unsigned long long __m64; +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); + +/* PR84033. Extracted from xmmintrin.h but with a pointer param to + allow swaps to happen when not inline. */ +int __attribute__ ((__noinline__)) +_mm_movemask_ps (__m128 *__A) +{ + __vector __m64 result; + static const __vector unsigned int perm_mask = + { + 0x00204060, 0x80808080, 0x80808080, 0x80808080 + }; + + result = (__vector __m64) + __builtin_vec_vbpermq ((__vector unsigned char) (*__A), + (__vector unsigned char) perm_mask); + return result[1]; +} + +int +main (void) +{ + union { unsigned int i[4]; __m128 m; } x + = { 0x80000000, 0x80000000, 0x7fffffff, 0x7fffffff }; + if (_mm_movemask_ps (&x.m) != 3) + __builtin_abort (); + return 0; +}