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 <wschm...@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 <wschm...@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" } */ +}