middle-end/100464 - avoid spurious TREE_ADDRESSABLE in folding debug stmts

canonicalize_constructor_val was setting TREE_ADDRESSABLE on bases
of ADDR_EXPRs but that's futile when we're dealing with CTOR values
in debug stmts.  This rips out the code which was added for Java
and should have been an assertion when we didn't have debug stmts.
To not regress g++.dg/tree-ssa/array-temp1.C we have to adjust the
testcase to not look for a no longer applied invalid optimization.

2021-05-10  Richard Biener  <rguenther@suse.de>

	PR middle-end/100464
	PR c++/100468
gcc/
	* gimple-fold.c (canonicalize_constructor_val): Do not set
	TREE_ADDRESSABLE.

gcc/cp/
	* call.c (set_up_extended_ref_temp): Mark the temporary
	addressable if the TARGET_EXPR was.

gcc/testsuite/
	* gcc.dg/pr100464.c: New testcase.
	* g++.dg/tree-ssa/array-temp1.C: Adjust.
This commit is contained in:
Richard Biener 2021-05-07 09:51:18 +02:00
parent a564da506f
commit a076632e27
4 changed files with 21 additions and 7 deletions

View File

@ -12478,6 +12478,8 @@ set_up_extended_ref_temp (tree decl, tree expr, vec<tree, va_gc> **cleanups,
VAR. */
if (TREE_CODE (expr) != TARGET_EXPR)
expr = get_target_expr (expr);
else if (TREE_ADDRESSABLE (expr))
TREE_ADDRESSABLE (var) = 1;
if (TREE_CODE (decl) == FIELD_DECL
&& extra_warnings && !TREE_NO_WARNING (decl))

View File

@ -245,7 +245,9 @@ canonicalize_constructor_val (tree cval, tree from_decl)
if (TREE_TYPE (base) == error_mark_node)
return NULL_TREE;
if (VAR_P (base))
TREE_ADDRESSABLE (base) = 1;
/* ??? We should be able to assert that TREE_ADDRESSABLE is set,
but since the use can be in a debug stmt we can't. */
;
else if (TREE_CODE (base) == FUNCTION_DECL)
{
/* Make sure we create a cgraph node for functions we'll reference.

View File

@ -13,9 +13,3 @@ int f()
using AR = const int[];
return AR{ 1,42,3,4,5,6,7,8,9,0 }[5];
}
int g()
{
std::initializer_list<int> a = {1,42,3};
return a.begin()[0];
}

View File

@ -0,0 +1,16 @@
/* { dg-do compile } */
/* { dg-options "-O3 -fcompare-debug" } */
int *a;
static int b, c, d, e, g, h;
int f;
void i() {
int *j[] = {&e, &b, &b, &d, &b, &b, &g, &e, &g, &b, &b,
&b, &b, &g, &e, &e, &b, &b, &d, &b, &b, &e,
&e, &g, &b, &b, &b, &b, &g, &e, &g, &c, &e};
int **k = &j[5];
for (; f;)
b |= *a;
*k = &h;
}
int main() {}