From a076632e274abe344ca7648b7c7f299273d4cbe0 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 7 May 2021 09:51:18 +0200 Subject: [PATCH] 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 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. --- gcc/cp/call.c | 2 ++ gcc/gimple-fold.c | 4 +++- gcc/testsuite/g++.dg/tree-ssa/array-temp1.C | 6 ------ gcc/testsuite/gcc.dg/pr100464.c | 16 ++++++++++++++++ 4 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr100464.c diff --git a/gcc/cp/call.c b/gcc/cp/call.c index d985e4e8eda9..f07e09a36d14 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -12478,6 +12478,8 @@ set_up_extended_ref_temp (tree decl, tree expr, vec **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)) diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index aa33779b7531..768ef89d8762 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -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. diff --git a/gcc/testsuite/g++.dg/tree-ssa/array-temp1.C b/gcc/testsuite/g++.dg/tree-ssa/array-temp1.C index 97c2e0521c9c..3df7aadd30ab 100644 --- a/gcc/testsuite/g++.dg/tree-ssa/array-temp1.C +++ b/gcc/testsuite/g++.dg/tree-ssa/array-temp1.C @@ -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 a = {1,42,3}; - return a.begin()[0]; -} diff --git a/gcc/testsuite/gcc.dg/pr100464.c b/gcc/testsuite/gcc.dg/pr100464.c new file mode 100644 index 000000000000..46cc37dff546 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr100464.c @@ -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() {} -- 2.47.2