This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR57075


When fixing PR57036 made the inliner not add abnormal edges
from calls to non-local labels or setjmps I made it not split
the blocks after the possible source of abnormal control flow.
That turns out to upset the CFG verifier so the following
re-instantiates splitting of blocks.

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

Richard.

2013-04-29  Richard Biener  <rguenther@suse.de>

	PR middle-end/57075
	* tree-inline.c (copy_edges_for_bb): Still split the bbs,
	even if not adding abnormal edges for calls that can make
	abnormal gotos.

	* gcc.dg/torture/pr57075.c: New testcase.

Index: gcc/tree-inline.c
===================================================================
*** gcc/tree-inline.c	(revision 198409)
--- gcc/tree-inline.c	(working copy)
*************** copy_edges_for_bb (basic_block bb, gcov_
*** 1923,1933 ****
           into a COMPONENT_REF which doesn't.  If the copy
           can throw, the original could also throw.  */
        can_throw = stmt_can_throw_internal (copy_stmt);
!       /* If the call we inline cannot make abnormal goto do not add
!          additional abnormal edges but only retain those already present
! 	 in the original function body.  */
!       nonlocal_goto
! 	= can_make_abnormal_goto && stmt_can_make_abnormal_goto (copy_stmt);
  
        if (can_throw || nonlocal_goto)
  	{
--- 1927,1933 ----
           into a COMPONENT_REF which doesn't.  If the copy
           can throw, the original could also throw.  */
        can_throw = stmt_can_throw_internal (copy_stmt);
!       nonlocal_goto = stmt_can_make_abnormal_goto (copy_stmt);
  
        if (can_throw || nonlocal_goto)
  	{
*************** copy_edges_for_bb (basic_block bb, gcov_
*** 1955,1960 ****
--- 1955,1964 ----
        else if (can_throw)
  	make_eh_edges (copy_stmt);
  
+       /* If the call we inline cannot make abnormal goto do not add
+          additional abnormal edges but only retain those already present
+ 	 in the original function body.  */
+       nonlocal_goto &= can_make_abnormal_goto;
        if (nonlocal_goto)
  	make_abnormal_goto_edges (gimple_bb (copy_stmt), true);
  
Index: gcc/testsuite/gcc.dg/torture/pr57075.c
===================================================================
*** gcc/testsuite/gcc.dg/torture/pr57075.c	(revision 0)
--- gcc/testsuite/gcc.dg/torture/pr57075.c	(working copy)
***************
*** 0 ****
--- 1,15 ----
+ /* { dg-do compile } */
+ 
+ extern int baz (void) __attribute__ ((returns_twice));
+ int __attribute__ ((__leaf__))
+ foo (void)
+ {
+   return __builtin_printf ("$");
+ }
+ 
+ void
+ bar ()
+ {
+   foo ();
+   baz ();
+ }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]