aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2020-05-05 12:31:26 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2020-05-05 12:39:09 +0200
commit2badc9885330b56dfabb49328c42de792bc67b1e (patch)
treeb22c407697e40808090e2657de0ce0508a9a6f99
parent0424a5ece5307cc22bbc0fe97edf4707d7a798ed (diff)
downloadgcc-2badc9885330b56dfabb49328c42de792bc67b1e.zip
gcc-2badc9885330b56dfabb49328c42de792bc67b1e.tar.gz
gcc-2badc9885330b56dfabb49328c42de792bc67b1e.tar.bz2
Do not put incomplete CONSTRUCTORs into static memory
The CONSTRUCTOR_NO_CLEARING flag was invented to avoid generating a memset for CONSTRUCTORS that lack elements, but it turns out that the gimplifier can generate a memcpy for them instead, which is worse performance-wise, so this prevents it from doing that for them. * gimplify.c (gimplify_init_constructor): Do not put the constructor into static memory if it is not complete.
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimplify.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/aggr29.adb12
4 files changed, 22 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2267a63..7363478 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-05 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gimplify.c (gimplify_init_constructor): Do not put the constructor
+ into static memory if it is not complete.
+
2020-05-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/94949
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 2f2c51b..7807e30 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4995,8 +4995,8 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
all-zero initializers (which aren't big enough to merit
clearing), and don't try to make bitwise copies of
TREE_ADDRESSABLE types. */
-
if (valid_const_initializer
+ && complete_p
&& !(cleared || num_nonzero_elements == 0)
&& !TREE_ADDRESSABLE (type))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2ffa0f8..7f97394 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2020-05-05 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/aggr29.adb: New test.
+
2020-05-05 Richard Biener <rguenther@suse.de>
PR tree-optimization/94949
diff --git a/gcc/testsuite/gnat.dg/aggr29.adb b/gcc/testsuite/gnat.dg/aggr29.adb
new file mode 100644
index 0000000..c82a6f4
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr29.adb
@@ -0,0 +1,12 @@
+-- { dg-do compile }
+-- { dg-options "-fdump-tree-gimple" }
+
+with Ada.Streams; use Ada.Streams;
+
+procedure Aggr29 is
+ A : aliased Stream_Element_Array := (1 .. 512 => <>);
+begin
+ null;
+end;
+
+-- { dg-final { scan-tree-dump-not "a___UNC = \\*" "gimple" } }