tree-cfg.c (need_fake_edge_p): Return false for calls to builtins that return exactly once and do not throw.

* tree-cfg.c (need_fake_edge_p): Return false for calls to
	builtins that return exactly once and do not throw. Cache call to
	call_expr_flags.

From-SVN: r133929
This commit is contained in:
Ben Elliston 2008-04-05 03:50:18 +00:00 committed by Ben Elliston
parent c44b856a0b
commit 23ef6d211f
2 changed files with 21 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2008-04-05 Ben Elliston <bje@au.ibm.com>
* tree-cfg.c (need_fake_edge_p): Return false for calls to
builtins that return exactly once and do not throw. Cache call to
call_expr_flags.
2008-04-04 Andy Hutchinson <hutchinsonandy@aim.com>
PR rtl-optimization/34916

View File

@ -6420,7 +6420,8 @@ tree_block_ends_with_condjump_p (const_basic_block bb)
static bool
need_fake_edge_p (tree t)
{
tree call;
tree call, fndecl = NULL_TREE;
int call_flags;
/* NORETURN and LONGJMP calls already have an edge to exit.
CONST and PURE calls do not need one.
@ -6430,8 +6431,19 @@ need_fake_edge_p (tree t)
the counter incrementation code from -fprofile-arcs
leads to different results from -fbranch-probabilities. */
call = get_call_expr_in (t);
if (call
&& !(call_expr_flags (call) & ECF_NORETURN))
if (call)
{
fndecl = get_callee_fndecl (call);
call_flags = call_expr_flags (call);
}
if (call && fndecl && DECL_BUILT_IN (fndecl)
&& (call_flags & ECF_NOTHROW)
&& !(call_flags & ECF_NORETURN)
&& !(call_flags & ECF_RETURNS_TWICE))
return false;
if (call && !(call_flags & ECF_NORETURN))
return true;
if (TREE_CODE (t) == ASM_EXPR