From 3dc9eaa666c3820c8211d2cdc152adaabf54d65d Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Sun, 29 Mar 2009 00:08:07 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/cgraph.c | 32 ++++++++++++++++++++++--------- gcc/cgraphbuild.c | 27 +------------------------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/winline-10.c | 17 ++++++++++++++++ 5 files changed, 54 insertions(+), 35 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/winline-10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 46b558506c2..9ee7de8e709 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-03-28 Adam Nemet + + * 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 PR target/32542 diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 8eb0381d2be..d5dba426b1a 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -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; } diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index f9bc6201afb..3868712b3f7 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ee2e36005db..b1d82e189c4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-03-28 Adam Nemet + + * gcc.dg/winline-10.c: New test. + 2009-03-28 Tobias Burnus PR fortran/34656 diff --git a/gcc/testsuite/gcc.dg/winline-10.c b/gcc/testsuite/gcc.dg/winline-10.c new file mode 100644 index 00000000000..2106253fcf2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/winline-10.c @@ -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" } */