Commit 3dc9eaa6 by Adam Nemet Committed by Adam Nemet

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
parent 7fb0ee07
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> 2009-03-29 Ben Elliston <bje@au.ibm.com>
PR target/32542 PR target/32542
......
...@@ -652,6 +652,26 @@ cgraph_set_call_stmt (struct cgraph_edge *e, gimple new_stmt) ...@@ -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. */ /* Create edge from CALLER to CALLEE in the cgraph. */
struct cgraph_edge * struct cgraph_edge *
...@@ -679,15 +699,6 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee, ...@@ -679,15 +699,6 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
edge->uid = cgraph_edge_max_uid++; 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->aux = NULL;
edge->caller = caller; edge->caller = caller;
...@@ -721,6 +732,9 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee, ...@@ -721,6 +732,9 @@ cgraph_create_edge (struct cgraph_node *caller, struct cgraph_node *callee,
gcc_assert (!*slot); gcc_assert (!*slot);
*slot = edge; *slot = edge;
} }
initialize_inline_failed (edge);
return edge; return edge;
} }
......
...@@ -78,30 +78,6 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) ...@@ -78,30 +78,6 @@ record_reference (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
return NULL_TREE; 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 /* 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. */ cgraph_edge. BB is the basic block of the call statement. */
int int
...@@ -193,7 +169,6 @@ build_cgraph_edges (void) ...@@ -193,7 +169,6 @@ build_cgraph_edges (void)
} }
pointer_set_destroy (visited_nodes); pointer_set_destroy (visited_nodes);
initialize_inline_failed (node);
return 0; return 0;
} }
...@@ -253,8 +228,8 @@ rebuild_cgraph_edges (void) ...@@ -253,8 +228,8 @@ rebuild_cgraph_edges (void)
bb->loop_depth); bb->loop_depth);
} }
initialize_inline_failed (node);
gcc_assert (!node->global.inlined_to); gcc_assert (!node->global.inlined_to);
return 0; return 0;
} }
......
2009-03-28 Adam Nemet <anemet@caviumnetworks.com>
* gcc.dg/winline-10.c: New test.
2009-03-28 Tobias Burnus <burnus@net-b.de> 2009-03-28 Tobias Burnus <burnus@net-b.de>
PR fortran/34656 PR fortran/34656
......
/* { 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" } */
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