[gcc r11-9591] middle-end/100464 - avoid spurious TREE_ADDRESSABLE in folding debug stmts
Richard Biener
rguenth@gcc.gnu.org
Fri Feb 18 09:29:10 GMT 2022
https://gcc.gnu.org/g:462900ba21f5fdf865c93f693083da3179dd3151
commit r11-9591-g462900ba21f5fdf865c93f693083da3179dd3151
Author: Richard Biener <rguenther@suse.de>
Date: Fri May 7 09:51:18 2021 +0200
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.
(cherry picked from commit a076632e274abe344ca7648b7c7f299273d4cbe0)
Diff:
---
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(-)
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 81b0d0f27ff..2280fde1926 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -12531,6 +12531,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))
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 0308f098e18..bb4db5af280 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 97c2e0521c9..3df7aadd30a 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<int> 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 00000000000..46cc37dff54
--- /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() {}
More information about the Gcc-cvs
mailing list