PR86223 points out that we currently gimplify the testcase inconsistently.
For the incomplete CTORs we use block-clearing while for the complete
one we emit initializations of the individual elements (up to the
limits imposed in following checks).

So the following makes us always use = {}; form for all-zero CTORs
which is most compact for GIMPLE IL and should only result in better
code (fingers crossing...) since but not only beacause SRA got the
ability to handle a = .LC0; style inits as well.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2018-06-21  Richard Biener  <rguent...@suse.de>

        PR middle-end/86223
        * gimplify.c (gimplify_init_constructor): For an all-zero
        constructor emit a block-clear.

        * gcc.dg/pr86223-1.c: New testcase.

Index: gcc/gimplify.c
===================================================================
--- gcc/gimplify.c      (revision 261839)
+++ gcc/gimplify.c      (working copy)
@@ -4805,6 +4805,10 @@ gimplify_init_constructor (tree *expr_p,
             requires trickery to avoid quadratic compile-time behavior in
             large cases or excessive memory use in small cases.  */
          cleared = !CONSTRUCTOR_NO_CLEARING (ctor);
+       else if (num_nonzero_elements == 0)
+         /* If all elements are zero it is most efficient to block-clear
+            things.  */
+         cleared = true;
        else if (num_ctor_elements - num_nonzero_elements
                 > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
                 && num_nonzero_elements < num_ctor_elements / 4)
Index: gcc/testsuite/gcc.dg/pr86223-1.c
===================================================================
--- gcc/testsuite/gcc.dg/pr86223-1.c    (revision 0)
+++ gcc/testsuite/gcc.dg/pr86223-1.c    (working copy)
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-gimple" } */
+
+void f (int *);
+void g ()
+{
+  int a[3] = { 0, 0, 0 };
+  f (a);
+}
+void h ()
+{
+  int a[3] = { 0 };
+  f (a);
+}
+
+/* We should use block-clearing for the initializer of a in both cases.  */
+/* { dg-final { scan-tree-dump-times "a = {};" 2 "gimple" } } */

Reply via email to