Discussion:
[PATCH, rs6000] Warn for deprecated use of vec_lvsl and vec_lvsr for little endian
Bill Schmidt
2014-09-29 21:53:58 UTC
Permalink
Hi,

The vec_lvsl and vec_lvsr interfaces are deprecated for little endian in
the ELFv2 ABI document. At the moment, these interfaces will produce
incorrect code, and the only indication a programmer has of this is that
his or her code does not function correctly. This patch adds a warning
message to inform the little endian programmer of the deprecated usage.

The patch described in
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02580.html is a
prerequisite for this patch, as otherwise the deprecation message causes
bootstrap failure due to -Werror in the later stages.

I feel the deprecation message is needed because, in a future patch, we
plan to make vec_lvsl and vec_lvsr work so that BE code will run on LE
without requiring code modifications. However, code modifications are
still desirable because the LE code, while correct, will be pretty poor.
The deprecation message will encourage programmers to rewrite their code
that makes use of vec_lvsl/lvsr.

I've added a new test to demonstrate the message, and updated a number
of tests to use -Wno-deprecated so the new message doesn't disturb them.

Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
regressions. Is this ok for trunk?

Thanks,
Bill


[gcc]

2014-09-29 Bill Schmidt <***@linux.vnet.ibm.com>

* config/rs6000/rs6000-c.c (altivec_resolve_overloaded_builtin):
Issue a warning message when vec_lvsl or vec_lvsr is used with a
little endian target.

[gcc/testsuite]

2014-09-29 Bill Schmidt <***@linux.vnet.ibm.com>

* g++.dg/ext/altivec-2.C: Compile with -Wno-deprecated to avoid
failing with the new warning message.
* gcc.dg/vmx/3c-01a.c: Likewise.
* gcc.dg/vmx/ops-long-1.c: Likewise.
* gcc.dg/vmx/ops.c: Likewise.
* gcc.target/powerpc/altivec-20.c: Likewise.
* gcc.target/powerpc/altivec-6.c: Likewise.
* gcc.target/powerpc/altivec-vec-merge.c: Likewise.
* gcc.target/powerpc/vsx-builtin-8.c: Likewise.
* gcc.target/powerpc/warn-lvsl-lvsr.c: New test.


Index: gcc/config/rs6000/rs6000-c.c
===================================================================
--- gcc/config/rs6000/rs6000-c.c (revision 215691)
+++ gcc/config/rs6000/rs6000-c.c (working copy)
@@ -4326,6 +4326,14 @@ altivec_resolve_overloaded_builtin (location_t loc
if (TARGET_DEBUG_BUILTIN)
fprintf (stderr, "altivec_resolve_overloaded_builtin, code = %4d, %s\n",
(int)fcode, IDENTIFIER_POINTER (DECL_NAME (fndecl)));
+
+ /* vec_lvsl and vec_lvsr are deprecated for use with LE element order. */
+ if (fcode == ALTIVEC_BUILTIN_VEC_LVSL && !VECTOR_ELT_ORDER_BIG)
+ warning (OPT_Wdeprecated, "vec_lvsl is deprecated for little endian; use \
+assignment for unaligned loads and stores");
+ else if (fcode == ALTIVEC_BUILTIN_VEC_LVSR && !VECTOR_ELT_ORDER_BIG)
+ warning (OPT_Wdeprecated, "vec_lvsr is deprecated for little endian; use \
+assignment for unaligned loads and stores");

/* For now treat vec_splats and vec_promote as the same. */
if (fcode == ALTIVEC_BUILTIN_VEC_SPLATS
Index: gcc/testsuite/g++.dg/ext/altivec-2.C
===================================================================
--- gcc/testsuite/g++.dg/ext/altivec-2.C (revision 215691)
+++ gcc/testsuite/g++.dg/ext/altivec-2.C (working copy)
@@ -1,6 +1,6 @@
/* { dg-do compile { target powerpc*-*-* } } */
/* { dg-require-effective-target powerpc_altivec_ok } */
-/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable" } */
+/* { dg-options "-maltivec -Wall -Wno-unused-but-set-variable -Wno-deprecated" } */

/* This test checks if AltiVec builtins accept const-qualified
arguments. */
Index: gcc/testsuite/gcc.dg/vmx/3c-01a.c
===================================================================
--- gcc/testsuite/gcc.dg/vmx/3c-01a.c (revision 215691)
+++ gcc/testsuite/gcc.dg/vmx/3c-01a.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-options "-Wno-deprecated" } */
#include <altivec.h>
typedef const volatile unsigned int _1;
typedef const unsigned int _2;
Index: gcc/testsuite/gcc.dg/vmx/ops-long-1.c
===================================================================
--- gcc/testsuite/gcc.dg/vmx/ops-long-1.c (revision 215691)
+++ gcc/testsuite/gcc.dg/vmx/ops-long-1.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-options "-Wno-deprecated" } */

/* Checks from the original ops.c that pass pointers to long or
unsigned long for operations that support that in released versions
Index: gcc/testsuite/gcc.dg/vmx/ops.c
===================================================================
--- gcc/testsuite/gcc.dg/vmx/ops.c (revision 215691)
+++ gcc/testsuite/gcc.dg/vmx/ops.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-do compile } */
+/* { dg-options "-Wno-deprecated" } */
#include <altivec.h>
#include <stdlib.h>
extern char * *var_char_ptr;
Index: gcc/testsuite/gcc.target/powerpc/altivec-20.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/altivec-20.c (revision 215691)
+++ gcc/testsuite/gcc.target/powerpc/altivec-20.c (working copy)
@@ -1,5 +1,5 @@
/* { dg-do compile { target powerpc_altivec_ok } } */
-/* { dg-options "-maltivec -mcpu=G5 -O2" } */
+/* { dg-options "-maltivec -mcpu=G5 -O2 -Wno-deprecated" } */

#include <altivec.h>

Index: gcc/testsuite/gcc.target/powerpc/altivec-6.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/altivec-6.c (revision 215691)
+++ gcc/testsuite/gcc.target/powerpc/altivec-6.c (working copy)
@@ -1,6 +1,6 @@
/* { dg-do compile { target powerpc*-*-* } } */
/* { dg-require-effective-target powerpc_altivec_ok } */
-/* { dg-options "-maltivec -O0 -Wall" } */
+/* { dg-options "-maltivec -O0 -Wall -Wno-deprecated" } */

#include <altivec.h>

Index: gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c (revision 215691)
+++ gcc/testsuite/gcc.target/powerpc/altivec-vec-merge.c (working copy)
@@ -1,7 +1,7 @@
/* { dg-do run { target { powerpc*-*-* && vmx_hw } } } */
/* { dg-do compile { target { powerpc*-*-* && { ! vmx_hw } } } } */
/* { dg-require-effective-target powerpc_altivec_ok } */
-/* { dg-options "-maltivec -O2" } */
+/* { dg-options "-maltivec -O2 -Wno-deprecated" } */

#include <altivec.h>

Index: gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c (revision 215691)
+++ gcc/testsuite/gcc.target/powerpc/vsx-builtin-8.c (working copy)
@@ -1,7 +1,7 @@
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-require-effective-target powerpc_vsx_ok } */
-/* { dg-options "-O3 -mcpu=power7" } */
+/* { dg-options "-O3 -mcpu=power7 -Wno-deprecated" } */

/* Test the various load/store varients. */

Index: gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c (revision 0)
+++ gcc/testsuite/gcc.target/powerpc/warn-lvsl-lvsr.c (working copy)
@@ -0,0 +1,14 @@
+/* Test for deprecation messages on use of lvsl and lvsr for little endian. */
+
+/* { dg-do compile { target { powerpc64le-*-* } } } */
+/* { dg-options "-O0 -Wdeprecated" } */
+
+#include <altivec.h>
+
+float f[20];
+
+void foo ()
+{
+ vector unsigned char a = vec_lvsl (4, f); /* { dg-error "vec_lvsl is deprecated for little endian; use assignment for unaligned loads and stores" } */
+ vector unsigned char b = vec_lvsr (8, f); /* { dg-error "vec_lvsr is deprecated for little endian; use assignment for unaligned loads and stores" } */
+}
David Edelsohn
2014-10-03 18:22:33 UTC
Permalink
On Mon, Sep 29, 2014 at 5:53 PM, Bill Schmidt
Post by Bill Schmidt
Hi,
The vec_lvsl and vec_lvsr interfaces are deprecated for little endian in
the ELFv2 ABI document. At the moment, these interfaces will produce
incorrect code, and the only indication a programmer has of this is that
his or her code does not function correctly. This patch adds a warning
message to inform the little endian programmer of the deprecated usage.
The patch described in
https://gcc.gnu.org/ml/gcc-patches/2014-09/msg02580.html is a
prerequisite for this patch, as otherwise the deprecation message causes
bootstrap failure due to -Werror in the later stages.
I feel the deprecation message is needed because, in a future patch, we
plan to make vec_lvsl and vec_lvsr work so that BE code will run on LE
without requiring code modifications. However, code modifications are
still desirable because the LE code, while correct, will be pretty poor.
The deprecation message will encourage programmers to rewrite their code
that makes use of vec_lvsl/lvsr.
I've added a new test to demonstrate the message, and updated a number
of tests to use -Wno-deprecated so the new message doesn't disturb them.
Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
regressions. Is this ok for trunk?
Thanks,
Bill
[gcc]
Issue a warning message when vec_lvsl or vec_lvsr is used with a
little endian target.
[gcc/testsuite]
* g++.dg/ext/altivec-2.C: Compile with -Wno-deprecated to avoid
failing with the new warning message.
* gcc.dg/vmx/3c-01a.c: Likewise.
* gcc.dg/vmx/ops-long-1.c: Likewise.
* gcc.dg/vmx/ops.c: Likewise.
* gcc.target/powerpc/altivec-20.c: Likewise.
* gcc.target/powerpc/altivec-6.c: Likewise.
* gcc.target/powerpc/altivec-vec-merge.c: Likewise.
* gcc.target/powerpc/vsx-builtin-8.c: Likewise.
* gcc.target/powerpc/warn-lvsl-lvsr.c: New test.
Okay.

Thanks, David

Loading...