Commit a9730200 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/51719 (ICE: verify_gimple failed: LHS in noreturn call…

re PR tree-optimization/51719 (ICE: verify_gimple failed: LHS in noreturn call with -fpartial-inlining -fprofile-use and exceptions)

	PR tree-optimization/51719
	* value-prof.c (gimple_ic): When indirect call isn't noreturn,
	but direct call is, clear direct call's lhs and don't add fallthrough
	edge from dcall_bb to join_bb and PHIs.

	* g++.dg/tree-prof/pr51719.C: New test.

From-SVN: r182832
parent be5de7a1
2012-01-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51719
* value-prof.c (gimple_ic): When indirect call isn't noreturn,
but direct call is, clear direct call's lhs and don't add fallthrough
edge from dcall_bb to join_bb and PHIs.
2012-01-03 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> 2012-01-03 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* config/s390/s390.md ("*cmp<mode>_ccs"): Fix comment mentioning * config/s390/s390.md ("*cmp<mode>_ccs"): Fix comment mentioning
2012-01-03 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/51719
* g++.dg/tree-prof/pr51719.C: New test.
2012-01-03 Richard Guenther <rguenther@suse.de> 2012-01-03 Richard Guenther <rguenther@suse.de>
PR middle-end/51730 PR middle-end/51730
......
// PR tree-optimization/51719
// { dg-options "-O -fpartial-inlining" }
int
bar (void)
{
throw 1;
}
int __attribute__ ((noinline, noclone))
foo (int (*f) (void))
{
try
{
return (*f) ();
}
catch (...)
{
}
return 0;
}
int
main ()
{
return foo (bar);
}
/* Transformations based on profile information for values. /* Transformations based on profile information for values.
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -1149,7 +1149,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1149,7 +1149,7 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
tree optype = build_pointer_type (void_type_node); tree optype = build_pointer_type (void_type_node);
edge e_cd, e_ci, e_di, e_dj = NULL, e_ij; edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
int lp_nr; int lp_nr, dflags;
cond_bb = gimple_bb (icall_stmt); cond_bb = gimple_bb (icall_stmt);
gsi = gsi_for_stmt (icall_stmt); gsi = gsi_for_stmt (icall_stmt);
...@@ -1176,6 +1176,9 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1176,6 +1176,9 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
update_stmt (icall_stmt); update_stmt (icall_stmt);
dcall_stmt = gimple_copy (icall_stmt); dcall_stmt = gimple_copy (icall_stmt);
gimple_call_set_fndecl (dcall_stmt, direct_call->decl); gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
dflags = flags_from_decl_or_type (direct_call->decl);
if ((dflags & ECF_NORETURN) != 0)
gimple_call_set_lhs (dcall_stmt, NULL_TREE);
gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT); gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
/* Fix CFG. */ /* Fix CFG. */
...@@ -1220,17 +1223,23 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call, ...@@ -1220,17 +1223,23 @@ gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
if (e_ij != NULL) if (e_ij != NULL)
{ {
if ((dflags & ECF_NORETURN) != 0)
e_ij->count = all;
else
{
e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU); e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
e_dj->probability = REG_BR_PROB_BASE; e_dj->probability = REG_BR_PROB_BASE;
e_dj->count = count; e_dj->count = count;
e_ij->probability = REG_BR_PROB_BASE;
e_ij->count = all - count; e_ij->count = all - count;
} }
e_ij->probability = REG_BR_PROB_BASE;
}
/* Insert PHI node for the call result if necessary. */ /* Insert PHI node for the call result if necessary. */
if (gimple_call_lhs (icall_stmt) if (gimple_call_lhs (icall_stmt)
&& TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME) && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
&& (dflags & ECF_NORETURN) == 0)
{ {
tree result = gimple_call_lhs (icall_stmt); tree result = gimple_call_lhs (icall_stmt);
gimple phi = create_phi_node (result, join_bb); gimple phi = create_phi_node (result, join_bb);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment