On Tue, 16 Nov 2021, Tamar Christina wrote:

> Hi All,
> 
> convert_mult_to_fma assumes that all gimple_assigns have a LHS set.  This
> assumption is however not true when an IFN is kept around just for the
> side-effects.  In those situations you have just the IFN and lhs will be null.
> 
> Since there's no LHS, there also can't be any ADD and such it can't be an FMA
> so it's correct to just return early if no LHS.
> 
> Bootstrapped Regtested on aarch64-none-linux-gnu,
> x86_64-pc-linux-gnu and no regressions.
> 
> Ok for master?

OK.

Thanks,
Richard.

> Thanks,
> Tamar
> 
> 
> 
> gcc/ChangeLog:
> 
>       PR tree-optimizations/103253
>       * tree-ssa-math-opts.c (convert_mult_to_fma): Check for LHS.
> 
> gcc/testsuite/ChangeLog:
> 
>       * gcc.dg/vect/pr103253.c: New test.
> 
> --- inline copy of patch -- 
> diff --git a/gcc/testsuite/gcc.dg/vect/pr103253.c 
> b/gcc/testsuite/gcc.dg/vect/pr103253.c
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..abe3f09f3818d79a53f2aa962c6b6c06855d618e
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr103253.c
> @@ -0,0 +1,16 @@
> +/* { dg-do compile } */
> +/* { dg-require-effective-target fopenmp } */
> +/* { dg-additional-options "-O2 -fexceptions -fopenmp 
> -fno-delete-dead-exceptions -fno-trapping-math" } */
> +
> +double
> +do_work (double do_work_pri)
> +{
> +  int i;
> +
> +#pragma omp simd
> +  for (i = 0; i < 17; ++i)
> +    do_work_pri = (!i ? 0.5 : i) * 2.0;
> +
> +  return do_work_pri;
> +}
> +
> diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
> index 
> c4a6492b50df25b4cf296a75bd51e5af34eeacc7..cc8496c3c325f3cc303a90b9b9cac383e5a7942d
>  100644
> --- a/gcc/tree-ssa-math-opts.c
> +++ b/gcc/tree-ssa-math-opts.c
> @@ -3224,6 +3224,10 @@ convert_mult_to_fma (gimple *mul_stmt, tree op1, tree 
> op2,
>                    fma_deferring_state *state, tree mul_cond = NULL_TREE)
>  {
>    tree mul_result = gimple_get_lhs (mul_stmt);
> +  /* If there isn't a LHS then this can't be an FMA.  There can be no LHS
> +     if the statement was left just for the side-effects.  */
> +  if (!mul_result)
> +    return false;
>    tree type = TREE_TYPE (mul_result);
>    gimple *use_stmt, *neguse_stmt;
>    use_operand_p use_p;
> 
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to