https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77504
--- Comment #14 from Dominique d'Humieres <dominiq at lps dot ens.fr> --- In the dump-tree-original I see ... D.3906 = offset.2; D.3907 = ubound.0; D.3908 = (integer(kind=4)[0:] * restrict) c.data; D.3909 = c.offset; D.3910 = c.dim[0].lbound; D.3911 = c.dim[0].ubound; D.3912 = D.3910 + -1; { ... c.dim[0].lbound = 1; c.dim[0].ubound = NON_LVALUE_EXPR <D.3907>; c.dim[0].stride = 1; c.offset = -NON_LVALUE_EXPR <c.dim[0].lbound>; D.3909 = c.offset; D.3912 = c.dim[0].lbound + -1; c.span = 4; D.3921 = MAX_EXPR <(unsigned long) (D.3919 * 4), 1>; ... i.e., c.offset and c.dim[0].*bound are used before they are set.