Richard Sandiford <richard.sandif...@linaro.org> writes:
> In this PR we tried to create a widening multiply of two 3-bit numbers,
> but that isn't a widening multiply at the optab/rtl level, since both
> the input and output still have the same mode.
>
> We could trap this either in is_widening_mult_p or (as the patch does)
> in the routines that actually ask for an optab.  The latter seemed
> more natural since is_widening_mult_p doesn't otherwise care about modes.
>
> Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64-linux-gnu.
> OK to install?
>
> Richard
>
>
> 2017-11-03  Richard Sandiford  <richard.sandif...@linaro.org>
>           Alan Hayward  <alan.hayw...@arm.com>
>           David Sherwood  <david.sherw...@arm.com>

Oops, I instinctively used the SVE ChangeLog Header of the Day
for this patch too, but it was just me for this one.  (In case it
seemed strange that it took three people to write four lines...)

> gcc/
>       PR tree-optimization/82816
>       * tree-ssa-math-opts.c (convert_mult_to_widen): Return false
>       if the modes of the two types are the same.
>       (convert_plusminus_to_widen): Likewise.
>
> gcc/testsuite/
>       * gcc.c-torture/compile/pr82816.c: New test.
>
> Index: gcc/tree-ssa-math-opts.c
> ===================================================================
> --- gcc/tree-ssa-math-opts.c  2017-11-01 12:29:40.203534002 +0000
> +++ gcc/tree-ssa-math-opts.c  2017-11-03 11:18:03.046411241 +0000
> @@ -3259,6 +3259,9 @@ convert_mult_to_widen (gimple *stmt, gim
>  
>    to_mode = SCALAR_INT_TYPE_MODE (type);
>    from_mode = SCALAR_INT_TYPE_MODE (type1);
> +  if (to_mode == from_mode)
> +    return false;
> +
>    from_unsigned1 = TYPE_UNSIGNED (type1);
>    from_unsigned2 = TYPE_UNSIGNED (type2);
>  
> @@ -3449,6 +3452,9 @@ convert_plusminus_to_widen (gimple_stmt_
>  
>    to_mode = SCALAR_TYPE_MODE (type);
>    from_mode = SCALAR_TYPE_MODE (type1);
> +  if (to_mode == from_mode)
> +    return false;
> +
>    from_unsigned1 = TYPE_UNSIGNED (type1);
>    from_unsigned2 = TYPE_UNSIGNED (type2);
>    optype = type1;
> Index: gcc/testsuite/gcc.c-torture/compile/pr82816.c
> ===================================================================
> --- /dev/null 2017-11-03 10:40:07.002381728 +0000
> +++ gcc/testsuite/gcc.c-torture/compile/pr82816.c     2017-11-03 
> 11:18:03.045411265 +0000
> @@ -0,0 +1,12 @@
> +struct A
> +{
> +  int b:3;
> +} d, e;
> +
> +int c;
> +
> +void f ()
> +{
> +  char g = d.b * e.b;
> +  c = g;
> +}

Reply via email to