]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end/100464 - avoid spurious TREE_ADDRESSABLE in folding debug stmts
authorRichard Biener <rguenther@suse.de>
Fri, 7 May 2021 07:51:18 +0000 (09:51 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 10 May 2021 09:40:39 +0000 (11:40 +0200)
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.

gcc/cp/call.c
gcc/gimple-fold.c
gcc/testsuite/g++.dg/tree-ssa/array-temp1.C
gcc/testsuite/gcc.dg/pr100464.c [new file with mode: 0644]

index d985e4e8eda95b6545acb9733b3861cbc1825032..f07e09a36d142a1adf5e6ac83b0b1e71ee113278 100644 (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))
index aa33779b7531d2f4f5271353e7f0dfaddc209518..768ef89d87626b4e7300acdda7b500e98715e1ec 100644 (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.
index 97c2e0521c9ce835b4594f3da8c9d0fcdfb2701d..3df7aadd30ab552160b8ee4b08dc378bd6ef6236 100644 (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];
-}
diff --git a/gcc/testsuite/gcc.dg/pr100464.c b/gcc/testsuite/gcc.dg/pr100464.c
new file mode 100644 (file)
index 0000000..46cc37d
--- /dev/null
@@ -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() {}