https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104529
--- Comment #9 from Jakub Jelinek <jakub at gcc dot gnu.org> --- When I disable the TREE_READONLY (decl) = true; in build_target_expr, on the array-temp1.C testcase gimple dump changes: int f () { int D.2491; - static const int C.0[10] = {1, 42, 3, 4, 5, 6, 7, 8, 9, 0}; + const int D.2435[10]; typedef const int AR[<unknown>]; - try - { - D.2491 = C.0[5]; - return D.2491; - } - finally - { - C.0 = {CLOBBER(eol)}; - } + D.2435[0] = 1; + D.2435[1] = 42; + D.2435[2] = 3; + D.2435[3] = 4; + D.2435[4] = 5; + D.2435[5] = 6; + D.2435[6] = 7; + D.2435[7] = 8; + D.2435[8] = 9; + D.2435[9] = 0; + D.2491 = D.2435[5]; + return D.2491; which seems quite undesirable change. The spot that cares about TREE_READONLY is exactly in gimplify_init_constructor: /* If a const aggregate variable is being initialized, then it should never be a lose to promote the variable to be static. */ if (valid_const_initializer && num_nonzero_elements > 1 && TREE_READONLY (object) && VAR_P (object) && !DECL_REGISTER (object) && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)) ... So, the #c5 patch looks wrong from this regard too. Furthermore, we have that notify_temp_creation mode there and I think we really don't want to clear TREE_READONLY in that case. So, I think we need something like: --- gcc/gimplify.cc.jj 2022-03-03 09:13:16.000000000 +0100 +++ gcc/gimplify.cc 2022-03-03 14:42:00.952959549 +0100 @@ -5120,6 +5120,12 @@ gimplify_init_constructor (tree *expr_p, { if (notify_temp_creation) return GS_OK; + + /* The var will be initialized and so appear on lhs of + assignment, it can't be TREE_READONLY anymore. */ + if (VAR_P (object)) + TREE_READONLY (object) = 0; + is_empty_ctor = true; break; } @@ -5171,6 +5177,11 @@ gimplify_init_constructor (tree *expr_p, break; } + /* The var will be initialized and so appear on lhs of + assignment, it can't be TREE_READONLY anymore. */ + if (VAR_P (object) && !notify_temp_creation) + TREE_READONLY (object) = 0; + /* If there are "lots" of initialized elements, even discounting those that are not address constants (and thus *must* be computed at runtime), then partition the constructor into or so.