https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123755

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |ASSIGNED

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
It seems that there's no IFN_COND_LEN_FMA?  There's

DEF_INTERNAL_COND_FN (FMA, ECF_CONST, fma, ternary)

but

internal_fn
get_len_internal_fn (internal_fn fn)
{
  switch (fn)
    {
#define DEF_INTERNAL_COND_FN(NAME, ...)                                       
\
  case IFN_COND_##NAME:                                                       
\
    return IFN_COND_LEN_##NAME;
#define DEF_INTERNAL_SIGNED_COND_FN(NAME, ...)                                
\
  case IFN_COND_##NAME:                                                       
\
    return IFN_COND_LEN_##NAME;
#include "internal-fn.def"
    default:

so it seems get_len_internal_fn expects a conditional internal function
argument(?)  vectorizable_call passes it the 'ifn' which is IFN_FMA in
this case.

I met a similar oddity in get_conditional_internal_fn which returns
IFN_LAST for IFN_COND_FMA.

With this fixed we ICE here:

3888                          vargs[len_opno] = len;
3889                          vargs[len_opno + 1] = bias;

because internal_fn_len_index of IFN_COND_LEN_FMA is 5.  We fail to count
the mask.

I have a fix for all of this ...

Reply via email to