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)