[PATCH, rs6000] Fix vector long long subtype (PR96139)

Hi,
  This corrects an issue with the powerpc vector long long subtypes.
As reported by SjMunroe, when building some code with -Wall, and
attempting to print an element of a "long long vector" with a
long long printf format string, we will report an error because
the vector sub-type was improperly defined as int.

When defining a V2DI_type_node we use a TARGET_POWERPC64 ternary to
define the V2DI_type_node with "vector long" or "vector long long".
We also need to specify the proper sub-type when we define the type.

PR target/96139

2020-09-03  Will Schmidt  <will_schmidt@vnet.ibm.com>

gcc/ChangeLog:
	* config/rs6000/rs6000-call.c (rs6000_init_builtin): Update V2DI_type_node
	and unsigned_V2DI_type_node definitions.

gcc/testsuite/ChangeLog:
	* gcc.target/powerpc/pr96139-a.c: New test.
	* gcc.target/powerpc/pr96139-b.c: New test.
	* gcc.target/powerpc/pr96139-c.c: New test.
This commit is contained in:
Will Schmidt 2020-07-20 10:51:37 -05:00
parent ba6730bd18
commit d8f3474ff8
4 changed files with 92 additions and 2 deletions

View File

@ -12801,7 +12801,7 @@ rs6000_init_builtins (void)
V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64 ? "__vector long"
: "__vector long long",
intDI_type_node, 2);
long_long_integer_type_node, 2);
V2DF_type_node = rs6000_vector_type ("__vector double", double_type_node, 2);
V4SI_type_node = rs6000_vector_type ("__vector signed int",
intSI_type_node, 4);
@ -12820,7 +12820,7 @@ rs6000_init_builtins (void)
unsigned_V2DI_type_node = rs6000_vector_type (TARGET_POWERPC64
? "__vector unsigned long"
: "__vector unsigned long long",
unsigned_intDI_type_node, 2);
long_long_unsigned_type_node, 2);
opaque_V4SI_type_node = build_opaque_vector_type (intSI_type_node, 4);

View File

@ -0,0 +1,32 @@
/* { dg-do compile } */
/* { dg-options "-O2 -Wall -m32" } */
/* { dg-require-effective-target ilp32 } */
/* { dg-require-effective-target powerpc_altivec_ok } */
#include <stdio.h>
#include <altivec.h>
void
try_printing_longlong_a (
__vector signed char cval,
__vector signed int ival,
__vector signed long long int llval,
int x, int y, int z)
{
printf (" %016llx \n", llval[x]);
printf (" %016x \n", ival[z]);
printf (" %c \n", cval[y]);
}
void
try_printing_unsigned_longlong_a (
__vector unsigned char cval,
__vector unsigned int ival,
__vector unsigned long long int llval,
int x, int y, int z)
{
printf (" %016llx \n", llval[x]);
printf (" %016x \n", ival[z]);
printf (" %c \n", cval[y]);
}

View File

@ -0,0 +1,32 @@
/* { dg-do compile } */
/* { dg-options "-O2 -Wall -m64" } */
/* { dg-require-effective-target lp64 } */
/* { dg-require-effective-target powerpc_altivec_ok } */
#include <stdio.h>
#include <altivec.h>
void
try_printing_longlong_a (
__vector signed char cval,
__vector signed int ival,
__vector signed long long int llval,
int x, int y, int z)
{
printf (" %016llx \n", llval[x]);
printf (" %016x \n", ival[z]);
printf (" %c \n", cval[y]);
}
void
try_printing_unsigned_longlong_a (
__vector unsigned char cval,
__vector unsigned int ival,
__vector unsigned long long int llval,
int x, int y, int z)
{
printf (" %016llx \n", llval[x]);
printf (" %016x \n", ival[z]);
printf (" %c \n", cval[y]);
}

View File

@ -0,0 +1,26 @@
/* { dg-do run } */
/* { dg-options "-O2 -Wall" } */
/* { dg-require-effective-target powerpc_altivec_ok } */
/*
* Based on test created by sjmunroe for pr96139
*/
#include <stdio.h>
#include <altivec.h>
volatile vector long long llfoo;
void
print_v2xint64_b () {
printf (" %016llx \n", llfoo[0]);
printf (" %016llx \n", llfoo[1]);
}
int
main() {
llfoo[0]=12345678;
llfoo[1]=34567890;
print_v2xint64_b();
return 0;
}