gimplify: Clear TREE_READONLY on automatic vars being stored into [PR104529]

The following testcase regressed when SRA started punting on stores to
TREE_READONLY vars.  We document that:
"In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
nonzero means it may not be the lhs of an assignment."
so the SRA change looks desirable.  On the other side, at least in this
testcase the TREE_READONLY is set there intentionally from the
PR85873 fix, because gimplify_init_constructor itself uses TREE_READONLY
on the object to determine if it can perform promotion to static const
or not.

So, similarly to other spots in the gimplifier where we also clear
TREE_READONLY when we emit IL that stores into the object, this
does the same in gimplify_init_constructor, but in the way so that
the TREE_READONLY test for the promotion to static const keeps working
and doesn't change anything for notify_temp_creation mode, which doesn't
emit any IL, just tests if it would need a temporary or not.

This keeps PR85873 testcase working as before and fixes this regression.

2022-03-04  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/104529
	* gimplify.cc (gimplify_init_constructor): Clear TREE_READONLY
	on automatic objects which will be runtime initialized.

	* g++.dg/tree-ssa/pr104529.C: New test.
This commit is contained in:
Jakub Jelinek 2022-03-04 15:14:59 +01:00
parent 07395f19df
commit c85aaf2cbe
2 changed files with 31 additions and 0 deletions

View file

@ -5120,6 +5120,12 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_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, gimple_seq *pre_p, gimple_seq *post_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

View file

@ -0,0 +1,20 @@
// PR middle-end/104529
// { dg-do compile { target c++11 } }
// { dg-options "-O2 -fdump-tree-optimized" }
// { dg-final { scan-tree-dump-not "MEM\[^\n\r]*MEM" "optimized" } }
#include <cstddef>
#include <vector>
struct S {
unsigned int a;
std::vector<unsigned char> b;
std::vector<unsigned char> c;
};
std::size_t
foo ()
{
S test[] = { { 48, { 255, 0, 0, 0, 0, 0 } } };
return sizeof (test);
}