Fix oversight in gimplifier

Message ID 27810203.vj4aXM48tj@polaris
State New
Headers show
Series
  • Fix oversight in gimplifier
Related show

Commit Message

Eric Botcazou June 19, 2018, 8:10 a.m.
Hi,

as spotted by Richard B., there is an oversight in the implementation of 
CONSTRUCTOR_NO_CLEARING in the gimplifier: it may be overruled depending on 
the outcome of the clearing heuristics.

Tested on x86-64/Linux, OK for the mainline?  Can I put this on the 8 and 7 
branches too (only the Ada compiler sets the flag at the moment)?


2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>

	* gimplify.c (gimplify_init_constructor): Really never clear for an
	incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.


2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/aggr24.adb: New test.
	* gnat.dg/aggr24_pkg.ad[sb]: New helper.

-- 
Eric Botcazou

Comments

Richard Biener June 19, 2018, 9:18 a.m. | #1
On Tue, Jun 19, 2018 at 10:11 AM Eric Botcazou <ebotcazou@adacore.com> wrote:
>

> Hi,

>

> as spotted by Richard B., there is an oversight in the implementation of

> CONSTRUCTOR_NO_CLEARING in the gimplifier: it may be overruled depending on

> the outcome of the clearing heuristics.

>

> Tested on x86-64/Linux, OK for the mainline?  Can I put this on the 8 and 7

> branches too (only the Ada compiler sets the flag at the moment)?


OK everywhere.

Thanks,
Richard.

>

> 2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>

>

>         * gimplify.c (gimplify_init_constructor): Really never clear for an

>         incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.

>

>

> 2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>

>

>         * gnat.dg/aggr24.adb: New test.

>         * gnat.dg/aggr24_pkg.ad[sb]: New helper.

>

> --

> Eric Botcazou

Patch

Index: gimplify.c
===================================================================
--- gimplify.c	(revision 261687)
+++ gimplify.c	(working copy)
@@ -4795,7 +4795,7 @@  gimplify_init_constructor (tree *expr_p,
 	     objects.  Initializers for such objects must explicitly set
 	     every field that needs to be set.  */
 	  cleared = false;
-	else if (!complete_p && !CONSTRUCTOR_NO_CLEARING (ctor))
+	else if (!complete_p)
 	  /* If the constructor isn't complete, clear the whole object
 	     beforehand, unless CONSTRUCTOR_NO_CLEARING is set on it.
 
@@ -4804,7 +4804,7 @@  gimplify_init_constructor (tree *expr_p,
 	     we'd need to *find* the elements that are not present, and that
 	     requires trickery to avoid quadratic compile-time behavior in
 	     large cases or excessive memory use in small cases.  */
-	  cleared = true;
+	  cleared = !CONSTRUCTOR_NO_CLEARING (ctor);
 	else if (num_ctor_elements - num_nonzero_elements
 		 > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
 		 && num_nonzero_elements < num_ctor_elements / 4)