diff mbox series

[Ada] Fix profile mismatch with -fprofile-{generate,use} at -O2

Message ID 1786582.xGmHWxF9j1@polaris
State New
Headers show
Series [Ada] Fix profile mismatch with -fprofile-{generate,use} at -O2 | expand

Commit Message

Eric Botcazou Feb. 8, 2019, 11:08 a.m. UTC
This is a regression present on all active branches: in some cases, you get 
bogus profile mismatches with -fprofile-{generate,use} at -O2 because some -O3 
optimizations are automatically enabled by -fprofile-use.

Tested on x86_64-suse-linux, applied on all active branches.


2019-02-08  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (Regular_Loop_to_gnu): Replace tests on
	individual flag_unswitch_loops and flag_tree_loop_vectorize switches
	with test on global optimize switch.
	(Raise_Error_to_gnu): Likewise.
diff mbox series

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 268508)
+++ gcc-interface/trans.c	(working copy)
@@ -3787,7 +3787,7 @@  Regular_Loop_to_gnu (Node_Id gnat_node,
 	 unswitching is enabled, do not require the loop bounds to be also
 	 invariant, as their evaluation will still be ahead of the loop.  */
       if (vec_safe_length (gnu_loop_info->checks) > 0
-	 && (make_invariant (&gnu_low, &gnu_high) || flag_unswitch_loops))
+	 && (make_invariant (&gnu_low, &gnu_high) || optimize >= 3))
 	{
 	  struct range_check_info_d *rci;
 	  unsigned int i, n_remaining_checks = 0;
@@ -3840,22 +3840,21 @@  Regular_Loop_to_gnu (Node_Id gnat_node,
 	  /* Note that loop unswitching can only be applied a small number of
 	     times to a given loop (PARAM_MAX_UNSWITCH_LEVEL default to 3).  */
 	  if (IN_RANGE (n_remaining_checks, 1, 3)
-	      && optimize > 1
+	      && optimize >= 2
 	      && !optimize_size)
 	    FOR_EACH_VEC_ELT (*gnu_loop_info->checks, i, rci)
 	      if (rci->invariant_cond != boolean_false_node)
 		{
 		  TREE_OPERAND (rci->inserted_cond, 0) = rci->invariant_cond;
 
-		  if (flag_unswitch_loops)
+		  if (optimize >= 3)
 		    add_stmt_with_node_force (rci->inserted_cond, gnat_node);
 		}
 	}
 
       /* Second, if loop vectorization is enabled and the iterations of the
 	 loop can easily be proved as independent, mark the loop.  */
-      if (optimize
-	  && flag_tree_loop_vectorize
+      if (optimize >= 3
 	  && independent_iterations_p (LOOP_STMT_BODY (gnu_loop_stmt)))
 	LOOP_STMT_IVDEP (gnu_loop_stmt) = 1;
 
@@ -6478,7 +6477,7 @@  Raise_Error_to_gnu (Node_Id gnat_node, t
 		= build1 (SAVE_EXPR, boolean_type_node, boolean_true_node);
 	      vec_safe_push (loop->checks, rci);
 	      gnu_cond = build_noreturn_cond (gnat_to_gnu (gnat_cond));
-	      if (flag_unswitch_loops)
+	      if (optimize >= 3)
 		gnu_cond = build_binary_op (TRUTH_ANDIF_EXPR,
 					    boolean_type_node,
 					    rci->inserted_cond,