[PATCH] Fix vect rotate pattern recog (PR target/92723)

Richard Sandiford richard.sandiford@arm.com
Wed Dec 11 17:57:00 GMT 2019


Jakub Jelinek <jakub@redhat.com> writes:
> On Wed, Dec 11, 2019 at 04:52:30PM +0000, Richard Sandiford wrote:
>> WDYT about instead having:
>> 
>>   if (dt != vect_internal_def || TYPE_MODE (TREE_TYPE (oprnd1)) == mode)
>> 
>> and removing the ext_def stuff?  I'd have expected keeping the original
>> operand to always be best for vect_external_def, and it avoids changing
>> the function body during what's supposed to be just an analysis phase.
>
> The ext_def stuff is needed in any case, for the -amount & mask expression.
> If all you mean is following, then I think it should work and can
> bootstrap/regtest it tonight (though just on x86_64/i686):

Yeah, this is what I meant, sorry for the vague description.

> 2019-12-11  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR target/92723
> 	* tree-vect-patterns.c (vect_recog_rotate_pattern): If dt is not
> 	vect_internal_def, use oprnd1 as is, without trying to cast it.
> 	Formatting fix.
>
> 	* gcc.dg/vect/pr92723.c: New test.

OK if it passes testing.

Thanks,
Richard

>
> --- gcc/tree-vect-patterns.c.jj	2019-12-10 21:34:45.103643981 +0100
> +++ gcc/tree-vect-patterns.c	2019-12-11 18:21:11.678218461 +0100
> @@ -2432,14 +2432,12 @@ vect_recog_rotate_pattern (stmt_vec_info
>        oprnd0 = def;
>      }
>  
> -  if (dt == vect_external_def
> -      && TREE_CODE (oprnd1) == SSA_NAME)
> +  if (dt == vect_external_def && TREE_CODE (oprnd1) == SSA_NAME)
>      ext_def = vect_get_external_def_edge (vinfo, oprnd1);
>  
>    def = NULL_TREE;
>    scalar_int_mode mode = SCALAR_INT_TYPE_MODE (type);
> -  if (TREE_CODE (oprnd1) == INTEGER_CST
> -      || TYPE_MODE (TREE_TYPE (oprnd1)) == mode)
> +  if (dt != vect_internal_def || TYPE_MODE (TREE_TYPE (oprnd1)) == mode)
>      def = oprnd1;
>    else if (def_stmt && gimple_assign_cast_p (def_stmt))
>      {
> @@ -2454,14 +2452,7 @@ vect_recog_rotate_pattern (stmt_vec_info
>      {
>        def = vect_recog_temp_ssa_var (type, NULL);
>        def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd1);
> -      if (ext_def)
> -	{
> -	  basic_block new_bb
> -	    = gsi_insert_on_edge_immediate (ext_def, def_stmt);
> -	  gcc_assert (!new_bb);
> -	}
> -      else
> -	append_pattern_def_seq (stmt_vinfo, def_stmt);
> +      append_pattern_def_seq (stmt_vinfo, def_stmt);
>      }
>    stype = TREE_TYPE (def);
>    scalar_int_mode smode = SCALAR_INT_TYPE_MODE (stype);
> --- gcc/testsuite/gcc.dg/vect/pr92723.c.jj	2019-12-11 18:19:09.944060313 +0100
> +++ gcc/testsuite/gcc.dg/vect/pr92723.c	2019-12-11 18:19:09.944060313 +0100
> @@ -0,0 +1,9 @@
> +/* { dg-do compile } */
> +
> +void
> +foo (unsigned long long *x, unsigned long long *y, int z)
> +{
> +  int i;
> +  for (i = 0; i < 1024; i++)
> +    x[i] = (y[i] >> z) | (y[i] << (-z & (__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1)));
> +}
>
>
> 	Jakub



More information about the Gcc-patches mailing list