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

--- Comment #9 from Martin Liška <marxin at gcc dot gnu.org> ---
> I think the canonical way of re-computing DECL_MODE would be to re-layout
> decls since that also updates RTL if that was already set.  There's
> relayout_decl for this which is for example called from omp-simd-clone.c
> and the vectorizer.

That's fine, however it eventually calls
SET_DECL_MODE (decl, TYPE_MODE (type));
which calls vector_type_mode (const_tree t)

and

  if (VECTOR_MODE_P (mode)
      && (!targetm.vector_mode_supported_p (mode)
          || !have_regs_of_mode[mode]))
    {
      scalar_int_mode innermode;

      /* For integers, try mapping it to a same-sized scalar mode.  */
      if (is_int_mode (TREE_TYPE (t)->type_common.mode, &innermode))
        {
          poly_int64 size = (TYPE_VECTOR_SUBPARTS (t)
                             * GET_MODE_BITSIZE (innermode));
          scalar_int_mode mode;
          if (int_mode_for_size (size, 0).exists (&mode)
              && have_regs_of_mode[mode]) <--- HERE
            return mode;
        }

      return BLKmode;
    }

HERE we return false. Do you know how current_function influences
int_mode_for_size and (or) have_regs_of_mode?

Reply via email to