https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70937
--- Comment #13 from Richard Biener <rguenth at gcc dot gnu.org> --- So it looks like we gimplify type sizes multiple times (in what order?!) and from ..__result = MAX_EXPR <*n, 0>; typedef character(kind=1) struct character(kind=1)[1:2][1:..__result][1:2][1:..__result]; { integer(kind=8) D.3659; ..__result = MAX_EXPR <*n, 0>; D.3659 = __result->dim[0].stride; stride.24 = D.3659 != 0 ? D.3659 : 1; __result.0 = (character(kind=1)[0:D.3662][1:..__result] * restrict) __result->data; size.26 = stride.24 * 2; offset.25 = -stride.24; D.3660 = (bitsizetype) (sizetype) ..__result * 8; D.3661 = (sizetype) ..__result; D.3662 = size.26 + -1; D.3663 = SAVE_EXPR <D.3660> * (bitsizetype) (sizetype) size.26; D.3664 = SAVE_EXPR <D.3661> * (sizetype) size.26; typedef character(kind=1) struct character(kind=1)[1:2][1:..__result][1:2][1:..__result]; produce _1 = *n; ..__result = MAX_EXPR <_1, 0>; D.4154 = D.3660; D.4155 = D.4154 * 2; D.4156 = D.3661; D.4157 = D.4156 * 2; { integer(kind=8) D.3659; _4 = *n; ..__result = MAX_EXPR <_4, 0>; D.3659 = __result->dim[0].stride; if (D.3659 != 0) goto <D.4159>; else goto <D.4160>; <D.4159>: iftmp.68 = D.3659; goto <D.4161>; <D.4160>: iftmp.68 = 1; <D.4161>: stride.24 = iftmp.68; __result.0 = __result->data; size.26 = stride.24 * 2; offset.25 = -stride.24; _5 = (sizetype) ..__result; _6 = (bitsizetype) _5; D.3660 = _6 * 8; D.3661 = (sizetype) ..__result; ... note how the first DECL_EXPR gets gimplifier handling (not strictly needed, only needed for unsharing) while the second "array" was gfc_trans_vla_type_sizes'ized. Note the respective array types are the multi-dimensional ones and are created for debug info only. Another "fix" is to avoid the sharing issue between IL and save-expr contents by simply making sure the IL we emit has no sharing issues. So the following also avoids the ICE on the original testcase and should be moderately light-weight (eventually the gimplifier unshares these anyway). Index: gcc/fortran/trans-decl.c =================================================================== --- gcc/fortran/trans-decl.c (revision 235945) +++ gcc/fortran/trans-decl.c (working copy) @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. /* Only for gfc_trans_code. Shouldn't need to include this. */ #include "trans-stmt.h" #include "gomp-constants.h" +#include "gimplify.h" #define MAX_LABEL_VALUE 99999 @@ -3738,7 +3739,7 @@ gfc_trans_vla_one_sizepos (tree *tp, stm var = gfc_create_var_np (TREE_TYPE (t), NULL); gfc_add_decl_to_function (var); - gfc_add_modify (body, var, val); + gfc_add_modify (body, var, unshare_expr (val)); if (TREE_CODE (t) == SAVE_EXPR) TREE_OPERAND (t, 0) = var; *tp = var; testing this variant as well now. No results before monday.