cgraphbuild.c (build_cgraph_edges, [...]): Don't call initialize_inline_failed.

* cgraphbuild.c (build_cgraph_edges, rebuild_cgraph_edges): Don't
	call initialize_inline_failed.
	(initialize_inline_failed): Move it from here ...
	* cgraph.c (initialize_inline_failed): ... to here.
	(cgraph_create_edge): Call initialize_inline_failed rather than
	setting inline_failed directly.

testsuite/
	* gcc.dg/winline-10.c: New test.

From-SVN: r145215
This commit is contained in:
Adam Nemet 2009-03-29 00:08:07 +00:00 committed by Adam Nemet
parent 7fb0ee07b4
commit 3dc9eaa666
5 changed files with 54 additions and 35 deletions

View file

@ -1,3 +1,12 @@
2009-03-28 Adam Nemet <anemet@caviumnetworks.com>
* cgraphbuild.c (build_cgraph_edges, rebuild_cgraph_edges): Don't
call initialize_inline_failed.
(initialize_inline_failed): Move it from here ...
* cgraph.c (initialize_inline_failed): ... to here.
(cgraph_create_edge): Call initialize_inline_failed rather than
setting inline_failed directly.
2009-03-29 Ben Elliston <bje@au.ibm.com>
PR target/32542

View file

@ -652,6 +652,26 @@ cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt)
}
}
/* Give initial reasons why inlining would fail on EDGE. This gets either
nullified or usually overwritten by more precise reasons later. */
static void
initialize_inline_failed (struct cgraph_edge *e)
{
struct cgraph_node *callee = e->callee;
if (!callee->analyzed)
e->inline_failed = CIF_BODY_NOT_AVAILABLE;
else if (callee->local.redefined_extern_inline)
e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
else if (!callee->local.inlinable)
e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
else if (gimple_call_cannot_inline_p (e->call_stmt))
e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
else
e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
}
/* Create edge from CALLER to CALLEE in the cgraph. */
struct cgraph_edge *
@ -679,15 +699,6 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
edge->uid = cgraph_edge_max_uid++;
}
if (!callee->analyzed)
edge->inline_failed = CIF_BODY_NOT_AVAILABLE;
else if (callee->local.redefined_extern_inline)
edge->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
else if (callee->local.inlinable)
edge->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
else
edge->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
edge->aux = NULL;
edge->caller = caller;
@ -721,6 +732,9 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
gcc_assert (!*slot);
*slot = edge;
}
initialize_inline_failed (edge);
return edge;
}

View file

@ -78,30 +78,6 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
return NULL_TREE;
}
/* Give initial reasons why inlining would fail on all calls from
NODE. Those get either nullified or usually overwritten by more precise
reason later. */
static void
initialize_inline_failed (struct cgraph_node *node)
{
struct cgraph_edge *e;
for (e = node->callers; e; e = e->next_caller)
{
gcc_assert (!e->callee->global.inlined_to);
gcc_assert (e->inline_failed);
if (node->local.redefined_extern_inline)
e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
else if (!node->local.inlinable)
e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
else if (gimple_call_cannot_inline_p (e->call_stmt))
e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
else
e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
}
}
/* Computes the frequency of the call statement so that it can be stored in
cgraph_edge. BB is the basic block of the call statement. */
int
@ -193,7 +169,6 @@ build_cgraph_edges (void)
}
pointer_set_destroy (visited_nodes);
initialize_inline_failed (node);
return 0;
}
@ -253,8 +228,8 @@ rebuild_cgraph_edges (void)
bb->loop_depth);
}
initialize_inline_failed (node);
gcc_assert (!node->global.inlined_to);
return 0;
}

View file

@ -1,3 +1,7 @@
2009-03-28 Adam Nemet <anemet@caviumnetworks.com>
* gcc.dg/winline-10.c: New test.
2009-03-28 Tobias Burnus <burnus@net-b.de>
PR fortran/34656

View file

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-options "-O2 -Winline" } */
struct s { int a; };
inline void f (x) /* { dg-warning "inlining .* mismatched arg" "" } */
int x;
{
asm ("");
}
void g (struct s x)
{
f (x); /* { dg-warning "called from here" "" } */
}
void f (int x); /* { dg-warning "follows non-prototype definition" } */