[Ada] Disable selected optimizations done in gigi at -Og

Message ID 1710019.EuIro4DUz7@polaris
State New
Headers show
Series
  • [Ada] Disable selected optimizations done in gigi at -Og
Related show

Commit Message

Eric Botcazou Sept. 23, 2019, 8:32 a.m.
This disables 3 optimizations done in gigi when the -Og switch is passed: the 
rotation of loops, the NRV optimization (Named Return Value) and the inlining 
of local finalizers.

Tested on x86_64-suse-linux, applied on the mainline.


2019-09-23  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (Regular_Loop_to_gnu): Do not rotate the loop
	if -Og is enabled.
	(build_return_expr): Do not perform NRV if -Og is enabled.
	(Subprogram_Body_to_gnu): Likewise.
	(gnat_to_gnu) <N_Simple_Return_Statement>: Likewise.
	(Handled_Sequence_Of_Statements_to_gnu): Do not inline finalizers if
	-Og is enabled.
	* gcc-interface/utils.c (convert_to_index_type): Return early if -Og
	is enabled.

-- 
Eric Botcazou

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 276045)
+++ gcc-interface/trans.c	(working copy)
@@ -3653,7 +3653,7 @@  Regular_Loop_to_gnu (Node_Id gnat_node,
 
 	 which works in all cases.  */
 
-      if (optimize)
+      if (optimize && !optimize_debug)
 	{
 	  /* We can use the do-while form directly if GNU_FIRST-1 doesn't
 	     overflow.  */
@@ -4436,6 +4436,7 @@  build_return_expr (tree ret_obj, tree re
 	 a candidate for Named Return Value.  If so, record it.  Otherwise,
 	 if this is an expression of some kind, record it elsewhere.  */
       if (optimize
+	  && !optimize_debug
 	  && AGGREGATE_TYPE_P (operation_type)
 	  && !TYPE_IS_FAT_POINTER_P (operation_type)
 	  && TYPE_MODE (operation_type) == BLKmode
@@ -4773,7 +4774,7 @@  Subprogram_Body_to_gnu (Node_Id gnat_nod
 
   /* If the function returns an aggregate type and we have candidates for
      a Named Return Value, finalize the optimization.  */
-  if (optimize && gnu_subprog_language->named_ret_val)
+  if (optimize && !optimize_debug && gnu_subprog_language->named_ret_val)
     {
       finalize_nrv (gnu_subprog_decl,
 		    gnu_subprog_language->named_ret_val,
@@ -5893,7 +5894,7 @@  Handled_Sequence_Of_Statements_to_gnu (N
 
       /* When not optimizing, disable inlining of finalizers as this can
 	 create a more complex CFG in the parent function.  */
-      if (!optimize)
+      if (!optimize || optimize_debug)
 	DECL_DECLARED_INLINE_P (proc_decl) = 0;
 
       /* If there is no end label attached, we use the location of the At_End
@@ -8050,7 +8051,9 @@  gnat_to_gnu (Node_Id gnat_node)
 
 		/* And find out whether this is a candidate for Named Return
 		   Value.  If so, record it.  */
-		if (!TYPE_CI_CO_LIST (gnu_subprog_type) && optimize)
+		if (optimize
+		    && !optimize_debug
+		    && !TYPE_CI_CO_LIST (gnu_subprog_type))
 		  {
 		    tree ret_val = gnu_ret_val;
 
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c	(revision 275988)
+++ gcc-interface/utils.c	(working copy)
@@ -5023,7 +5023,7 @@  convert_to_index_type (tree expr)
 
   /* If the type is unsigned, overflow is allowed so we cannot be sure that
      EXPR doesn't overflow.  Keep it simple if optimization is disabled.  */
-  if (TYPE_UNSIGNED (type) || !optimize)
+  if (TYPE_UNSIGNED (type) || !optimize || optimize_debug)
     return convert (sizetype, expr);
 
   switch (code)