https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104970
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakub at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Not a SSA_NAME, but no longer existing temporary. If a type has non-constant extents or bit or byte size, the vars (or SSA_NAMEs) used in those sizes are valid just during gimplification, they can't be recovered later on when they could have been DCEd or changed in some other way. For automatic VLAs the only thing that can be done is look up the corresponding __builtin_alloca_with_align and use its size argument as the size of the whole object, for VLA parameters it just doesn't exist. The gimple dump here has: __attribute__((access ("^1[$ ],$0", ))) void mleye (int l, double[0:D.1990] * E) { int l.0; sizetype D.1990; bitsizetype D.1991; sizetype D.1992; l.0 = l; _1 = (long int) l.0; _2 = _1 + -1; _3 = (sizetype) _2; D.1990 = _3; _4 = (sizetype) l.0; _5 = (bitsizetype) _4; _6 = _5 * 64; D.1991 = _6; _7 = (sizetype) l.0; _8 = _7 * 8; D.1992 = _8; memset2 (E, 0, 8); } so D.1990 is the TYPE_MAX_VALUE (TYPE_DOMAIN (type)) i.e. l - 1, D.1991 is TYPE_SIZE (type) (l * 64, i.e. bit size) and D.1992 is TYPE_SIZE_UNIT (type) (l * 8, i.e. byte size). The ssa pass turns all those into SSA_NAMEs though (and nothing updates the TYPE* values) and dse1 removes all those unused stmts. The objsz1 emergency dump shows though: _4 = (sizetype) l_1(D); _6 = D.1992 * _4; _5 = _6; __builtin___memset_chk (E_3(D), 0, 8, _5); so it strangely wants to multiply D.1992 (which can't be used but as sizeof (*E)) with l argument, so that is l * l * sizeof (double) if D.1992 could be used.