https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107647
--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Alexander Monakov from comment #15) > I'm confused about the first hunk in the attached patch: > > --- a/gcc/tree-vect-slp-patterns.cc > +++ b/gcc/tree-vect-slp-patterns.cc > @@ -1035,8 +1035,10 @@ complex_mul_pattern::matches (complex_operation_t op, > auto_vec<slp_tree> left_op, right_op; > slp_tree add0 = NULL; > > - /* Check if we may be a multiply add. */ > + /* Check if we may be a multiply add. It's only valid to form FMAs > + with -ffp-contract=fast. */ > if (!mul0 > + && flag_fp_contract_mode != FP_CONTRACT_FAST > && vect_match_expression_p (l0node[0], PLUS_EXPR)) > { > auto vals = SLP_TREE_CHILDREN (l0node[0]); > > > Shouldn't it be ' == FP_CONTRACT_FAST' rather than '!='? It seems we are > checking that a match is found and contracting across statement boundaries > is allowed. whoops yes, I'll fix and add a check for the type.