Do not put incomplete CONSTRUCTORs into static memory
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 5 May 2020 10:31:26 +0000 (12:31 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 5 May 2020 10:39:09 +0000 (12:39 +0200)
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.

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/aggr29.adb [new file with mode: 0644]

index 2267a63..7363478 100644 (file)
@@ -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
index 2f2c51b..7807e30 100644 (file)
@@ -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))
          {
index 2ffa0f8..7f97394 100644 (file)
@@ -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 (file)
index 0000000..c82a6f4
--- /dev/null
@@ -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" } }