[rs6000] fix PR 88100, range check for vec_splat_{su}{8,16,32}
GCC revision 259524 implemented range check for the vec_splat_{su}{8,16,32} builtins. However, as a consequence of the implementation, the range check is not done correctly for the expected vspltis[bhw] instructions. The result is that we may not get a valid error message if the valid range of the data is exceeded. Although the input of the function prototype of vec_splat_{su}{8,16,32} is const int, the actual data usage range is limited to the data range of 5 bits signed. We should limit the int_cst.val[0] data to the 5 bit signed data range without any modification in the input arg0 parameter. However, the sext_hwi function intercepts the data of TREE_INT_CST_LOW (arg0) as size bits in the sext_hwi (TREE_INT_CST_LOW (arg0), size) statement. This will cause some of the excess data to fall within the range of 5 bits signed, so that the correct diagnostic information cannot be generated, we need to remove the sext_hwi to ensure that the input data has not been modified. This patch fix range check for the vec_splat_s[8,16,32] builtins. The argument must be a 5-bit const int as specified for the vspltis[bhw] instructions. for gcc/ChangeLog PR target/88100 * gcc/config/rs6000/rs6000.c (rs6000_gimple_fold_builtin) <case ALTIVEC_BUILTIN_VSPLTISB, ALTIVEC_BUILTIN_VSPLTISH, ALTIVEC_BUILTIN_VSPLTISW>: Don't convert the operand before range checking it. for gcc/testsuite/ChangeLog PR target/88100 * gcc/testsuite/gcc.target/powerpc/pr88100.c: New testcase. From-SVN: r269033
This commit is contained in:
parent
9d35a27a83
commit
e86ae7bab3
4 changed files with 58 additions and 10 deletions
|
@ -1,3 +1,11 @@
|
|||
2019-02-20 Li Jia He <helijia@linux.ibm.com>
|
||||
|
||||
PR target/88100
|
||||
* gcc/config/rs6000/rs6000.c (rs6000_gimple_fold_builtin)
|
||||
<case ALTIVEC_BUILTIN_VSPLTISB, ALTIVEC_BUILTIN_VSPLTISH,
|
||||
ALTIVEC_BUILTIN_VSPLTISW>: Don't convert the operand before
|
||||
range checking it.
|
||||
|
||||
2019-02-19 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* config/gcn/gcn.c (print_operand): Fix typo.
|
||||
|
|
|
@ -16105,22 +16105,13 @@ rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi)
|
|||
case ALTIVEC_BUILTIN_VSPLTISH:
|
||||
case ALTIVEC_BUILTIN_VSPLTISW:
|
||||
{
|
||||
int size;
|
||||
if (fn_code == ALTIVEC_BUILTIN_VSPLTISB)
|
||||
size = 8;
|
||||
else if (fn_code == ALTIVEC_BUILTIN_VSPLTISH)
|
||||
size = 16;
|
||||
else
|
||||
size = 32;
|
||||
|
||||
arg0 = gimple_call_arg (stmt, 0);
|
||||
lhs = gimple_call_lhs (stmt);
|
||||
|
||||
/* Only fold the vec_splat_*() if the lower bits of arg 0 is a
|
||||
5-bit signed constant in range -16 to +15. */
|
||||
if (TREE_CODE (arg0) != INTEGER_CST
|
||||
|| !IN_RANGE (sext_hwi (TREE_INT_CST_LOW (arg0), size),
|
||||
-16, 15))
|
||||
|| !IN_RANGE (TREE_INT_CST_LOW (arg0), -16, 15))
|
||||
return false;
|
||||
gimple_seq stmts = NULL;
|
||||
location_t loc = gimple_location (stmt);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-02-20 Li Jia He <helijia@linux.ibm.com>
|
||||
|
||||
PR target/88100
|
||||
* gcc/testsuite/gcc.target/powerpc/pr88100.c: New testcase.
|
||||
|
||||
2019-02-19 Wilco Dijkstra <wdijkstr@arm.com>
|
||||
|
||||
* gcc.target/arm/pr88850.c: Block -mfloat-abi override.
|
||||
|
|
44
gcc/testsuite/gcc.target/powerpc/pr88100.c
Normal file
44
gcc/testsuite/gcc.target/powerpc/pr88100.c
Normal file
|
@ -0,0 +1,44 @@
|
|||
/* PR88100. Verify that rs6000 gimple-folding code handles the
|
||||
vec_splat_{su}{8,16,32} invalid data properly. */
|
||||
|
||||
/* { dg-do compile } */
|
||||
/* { dg-require-effective-target powerpc_altivec_ok } */
|
||||
/* { dg-options "-maltivec" } */
|
||||
|
||||
#include <altivec.h>
|
||||
|
||||
vector unsigned char
|
||||
splatu1 (void)
|
||||
{
|
||||
return vec_splat_u8(0x100);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
||||
|
||||
vector unsigned short
|
||||
splatu2 (void)
|
||||
{
|
||||
return vec_splat_u16(0x10000);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
||||
|
||||
vector unsigned int
|
||||
splatu3 (void)
|
||||
{
|
||||
return vec_splat_u32(0x10000000);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
||||
|
||||
vector signed char
|
||||
splats1 (void)
|
||||
{
|
||||
return vec_splat_s8(0x100);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
||||
|
||||
vector signed short
|
||||
splats2 (void)
|
||||
{
|
||||
return vec_splat_s16(0x10000);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
||||
|
||||
vector signed int
|
||||
splats3 (void)
|
||||
{
|
||||
return vec_splat_s32(0x10000000);/* { dg-error "argument 1 must be a 5-bit signed literal" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue