https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90756
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #5) > The r228175 > (promote_ssa_mode): Disregard BLKmode from promote_decl, and > > bypass TYPE_MODE to get the actual vector mode. > > > + /* Bypass TYPE_MODE when it maps vector modes to BLKmode. */ > > + if (mode == BLKmode) > > + { > > + gcc_assert (VECTOR_TYPE_P (type)); > > + mode = type->type_common.mode; > > + } > > + > > > change looks highly suspicious, that introduces in the IL vector modes that > aren't really supported. If that was done because some SSA_NAMEs might have > underlying decl that has DECL_MODE, I'd say we should either treat all > DECL_MODE similarly to TYPE_MODE, or add more hacks where for vector type > decls we just ignore DECL_MODE and use corresponding TYPE_MODE (I think we > have quite a few of those already). Indeed. We probably need to differentiate callers of promote_ssa_mode. Like the one in get_temp_reg seems to deal with BLKmode but AFAICS promote_ssa_mode will never return BLKmode itself? Thus Index: gcc/tree-outof-ssa.c =================================================================== --- gcc/tree-outof-ssa.c (revision 272616) +++ gcc/tree-outof-ssa.c (working copy) @@ -652,9 +652,10 @@ get_temp_reg (tree name) { tree type = TREE_TYPE (name); int unsignedp; - machine_mode reg_mode = promote_ssa_mode (name, &unsignedp); - if (reg_mode == BLKmode) + if (TYPE_MODE (type) == BLKmode) return assign_temp (type, 0, 0); + machine_mode reg_mode = promote_ssa_mode (name, &unsignedp); + gcc_assert (reg_mode != BLKmode); rtx x = gen_reg_rtx (reg_mode); if (POINTER_TYPE_P (type)) mark_reg_pointer (x, TYPE_ALIGN (TREE_TYPE (type))); the original change may have been motivated by ABI boundary issues of caller/callee mismatching in what ISA they support despite having arguments whose ABI depend on that?