diff mbox

[RFC] Unconditionally clean up CFG before emitting prologue

Message ID 201204091155.26101.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou April 9, 2012, 9:55 a.m. UTC
Hi,

with the numerous checks generated in Ada, the gimplification process can 
generated dead branches that aren't easily eliminated at -O0 and can impair 
the debugging experience.  We have found that unconditionally cleaning up the 
CFG before emitting the prologue/epilogue can help in some cases.  This is the 
same idiom already used in rest_of_handle_jump2 for example.

Tested on x86_64-suse-linux.  Comments?


2012-04-09  Eric Botcazou  <ebotcazou@adacore.com>

	* function.c (rest_of_handle_thread_prologue_and_epilogue): Clean up
	the CFG before generating prologue/epilogue even when not optimizing.

Comments

Richard Biener April 9, 2012, 11:07 a.m. UTC | #1
On Mon, Apr 9, 2012 at 11:55 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> Hi,
>
> with the numerous checks generated in Ada, the gimplification process can
> generated dead branches that aren't easily eliminated at -O0 and can impair
> the debugging experience.  We have found that unconditionally cleaning up the
> CFG before emitting the prologue/epilogue can help in some cases.  This is the
> same idiom already used in rest_of_handle_jump2 for example.
>
> Tested on x86_64-suse-linux.  Comments?

Isn't the gimple cfg-cleanup we run post optimization (right before expansion)
not enough?  Or the cfg-cleanup we perform right after expansion now?
At least if the branches are really caused by the gimplification process I would
expect things to be cleaned up at this point, no?

Richard.

>
>
> 2012-04-09  Eric Botcazou  <ebotcazou@adacore.com>
>
>        * function.c (rest_of_handle_thread_prologue_and_epilogue): Clean up
>        the CFG before generating prologue/epilogue even when not optimizing.
>
>
> --
> Eric Botcazou
diff mbox

Patch

Index: function.c
===================================================================
--- function.c	(revision 186176)
+++ function.c	(working copy)
@@ -6877,8 +6877,7 @@  struct rtl_opt_pass pass_leaf_regs =
 static unsigned int
 rest_of_handle_thread_prologue_and_epilogue (void)
 {
-  if (optimize)
-    cleanup_cfg (CLEANUP_EXPENSIVE);
+  cleanup_cfg (optimize ? CLEANUP_EXPENSIVE : 0);
 
   /* On some machines, the prologue and epilogue code, or parts thereof,
      can be represented as RTL.  Doing so lets us schedule insns between