re PR middle-end/44777 (ICE: SIGSEGV with -fprofile-use in gcc.c-torture/execute/comp-goto-2.c)

PR middle-end/44777
	* profile.c (branch_prob): Split bbs that have exit edge
	and need a fake entry edge too.

	* gcc.dg/tree-prof/pr44777.c: New test.

From-SVN: r182920
This commit is contained in:
Jakub Jelinek 2012-01-05 20:54:16 +01:00 committed by Jakub Jelinek
parent 56494762be
commit 1e69d24e61
4 changed files with 90 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/44777
* profile.c (branch_prob): Split bbs that have exit edge
and need a fake entry edge too.
2012-01-05 Jan Hubicka <jh@suse.cz>
PR middle-end/49710

View File

@ -1,6 +1,6 @@
/* Calculate branch probabilities, and basic block execution counts.
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by James E. Wilson, UC Berkeley/Cygnus Support;
based on some ideas from Dain Samples of UC Berkeley.
@ -1040,6 +1040,41 @@ branch_prob (void)
fprintf (dump_file, "Adding fake entry edge to bb %i\n",
bb->index);
make_edge (ENTRY_BLOCK_PTR, bb, EDGE_FAKE);
/* Avoid bbs that have both fake entry edge and also some
exit edge. One of those edges wouldn't be added to the
spanning tree, but we can't instrument any of them. */
if (have_exit_edge || need_exit_edge)
{
gimple_stmt_iterator gsi;
gimple first;
tree fndecl;
gsi = gsi_after_labels (bb);
gcc_checking_assert (!gsi_end_p (gsi));
first = gsi_stmt (gsi);
if (is_gimple_debug (first))
{
gsi_next_nondebug (&gsi);
gcc_checking_assert (!gsi_end_p (gsi));
first = gsi_stmt (gsi);
}
/* Don't split the bbs containing __builtin_setjmp_receiver
or __builtin_setjmp_dispatcher calls. These are very
special and don't expect anything to be inserted before
them. */
if (!is_gimple_call (first)
|| (fndecl = gimple_call_fndecl (first)) == NULL
|| DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_NORMAL
|| (DECL_FUNCTION_CODE (fndecl) != BUILT_IN_SETJMP_RECEIVER
&& (DECL_FUNCTION_CODE (fndecl)
!= BUILT_IN_SETJMP_DISPATCHER)))
{
if (dump_file)
fprintf (dump_file, "Splitting bb %i after labels\n",
bb->index);
split_block_after_labels (bb);
}
}
}
}

View File

@ -1,3 +1,8 @@
2012-01-05 Jakub Jelinek <jakub@redhat.com>
PR middle-end/44777
* gcc.dg/tree-prof/pr44777.c: New test.
2012-01-05 Jan Hubicka <jh@suse.cz>
PR middle-end/49710

View File

@ -0,0 +1,43 @@
/* PR middle-end/44777 */
/* { dg-options "-O0" } */
/* A variant of gcc.c-torture/execute/comp-goto-2.c. */
extern void abort (void);
extern void exit (int);
#ifdef STACK_SIZE
#define DEPTH ((STACK_SIZE) / 512 + 1)
#else
#define DEPTH 1000
#endif
#if ! defined (NO_LABEL_VALUES) && !defined (NO_TRAMPOLINES)
int
x (int a)
{
__label__ xlab;
void y (int a)
{
void *x = &&llab;
if (a==-1)
goto *x;
if (a==0)
goto xlab;
llab:
y (a-1);
}
y (a);
xlab:;
return a;
}
#endif
int
main ()
{
#if ! defined (NO_LABEL_VALUES) && !defined (NO_TRAMPOLINES)
if (x (DEPTH) != DEPTH)
abort ();
#endif
exit (0);
}