[PATCH] Fix PR64829

Kyrill Tkachov kyrylo.tkachov@arm.com
Wed Jan 28 16:20:00 GMT 2015


Hi Richard,

On 28/01/15 14:14, Richard Biener wrote:
> This fixes PR64829 where widening shift pattern detection fails to
> verify the widening operation is used only in the shift.
>
> Bootstrap and regtest running on x86_64-unknown-linux-gnu.

This patch causes a testsuite fail on an arm-none-eabi cross:
FAIL: gcc.dg/vect/vect-widen-shift-u8.c scan-tree-dump-times vect 
"vect_recog_widen_shift_pattern: detected" 2
FAIL: gcc.dg/vect/vect-widen-shift-u8.c -flto -ffat-lto-objects 
scan-tree-dump-times vect "vect_recog_widen_shift_pattern: detected" 2

The widen_shift pattern doesn't get recognised although the loop is 
still vectorised.
Is this something we can avoid?
Or should the test be adjusted?

Thanks,
Kyrill

>
> Richard.
>
> 2015-01-28  Richard Biener  <rguenther@suse.de>
>
> 	PR tree-optimization/64829
> 	* tree-vect-patterns.c (vect_recog_widen_shift_pattern): Check
> 	that the shift operand has a single use only.
>
> 	* gcc.dg/vect/pr64829.c: New testcase.
>
> Index: gcc/tree-vect-patterns.c
> ===================================================================
> --- gcc/tree-vect-patterns.c	(revision 220205)
> +++ gcc/tree-vect-patterns.c	(working copy)
> @@ -1732,9 +1732,11 @@ vect_recog_widen_shift_pattern (vec<gimp
>     if (TREE_CODE (oprnd0) != SSA_NAME || TREE_CODE (oprnd1) != INTEGER_CST)
>       return NULL;
>   
> -  /* Check operand 0: it has to be defined by a type promotion.  */
> -  if (!type_conversion_p (oprnd0, last_stmt, false, &half_type0, &def_stmt0,
> -                          &promotion)
> +  /* Check operand 0: it has to be defined by a type promotion and it
> +     should be only used by the shift.  */
> +  if (!has_single_use (oprnd0)
> +      || !type_conversion_p (oprnd0, last_stmt, false, &half_type0, &def_stmt0,
> +			     &promotion)
>         || !promotion)
>        return NULL;
>   
> Index: gcc/testsuite/gcc.dg/vect/pr64829.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/vect/pr64829.c	(revision 0)
> +++ gcc/testsuite/gcc.dg/vect/pr64829.c	(working copy)
> @@ -0,0 +1,66 @@
> +/* { dg-do compile } */
> +
> +typedef unsigned char Uint8;
> +typedef int Sint32;
> +typedef unsigned int Uint32;
> +
> +typedef union RMColorDataRef
> +{
> +  Uint8* data8;
> +} RMColorDataRef;
> +
> +typedef struct RMColorData
> +{
> +  Uint32 dataCount;
> +  RMColorDataRef dataRef;
> +} RMColorData;
> +
> +typedef struct RMColorTable
> +{
> +  Uint8 dataCompsOut;
> +  RMColorDataRef dataRef;
> +} RMColorTable;
> +
> +int fail ( const RMColorData * pInColor,
> +	   RMColorData * pOutColor,
> +	   const RMColorTable * pColorTable )
> +{
> +  Uint32 comp;
> +  Uint8 nCompOut;
> +
> +  Sint32 result;
> +
> +  Uint32 interpFrac1, interpFrac2, interpFrac3;
> +  Sint32 val0, val1, val2, val3;
> +
> +  Uint8 * pOut;
> +
> +  const Uint8 * pClutData;
> +  const Uint8 * pCornerPoint0;
> +
> +  Uint8 lastOut[((8) > (4) ? (8) : (4))];
> +
> +  pOut = pOutColor->dataRef.data8;
> +  pClutData = pColorTable->dataRef.data8;
> +
> +  nCompOut = pColorTable->dataCompsOut;
> +
> +  pCornerPoint0 = pClutData;
> +
> +  for (comp = 0; comp < nCompOut; comp++)
> +    {
> +      val0 = *pCornerPoint0++;
> +
> +      result = val0 << 4;
> +
> +      result += (val1 - val0) * interpFrac1;
> +      result += (val2 - val1) * interpFrac2;
> +      result += (val3 - val2) * interpFrac3;
> +
> +      *pOut++ = lastOut[comp] = (Uint8)(result >> 4);
> +    }
> +
> +  return (0);
> +}
> +
> +/* { dg-final { cleanup-tree-dump "vect" } } */
>




More information about the Gcc-patches mailing list