diff options
| author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-11 04:16:32 +0000 |
|---|---|---|
| committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-11 04:16:32 +0000 |
| commit | d9cdeb775555050bc79c86963773d554beaa6805 (patch) | |
| tree | 550fac8da22e222e4f83bafd10f69af38ff31f7b | |
| parent | 4c8420c9b081e5e11b17aad8495674196307bf76 (diff) | |
| download | ppe42-gcc-d9cdeb775555050bc79c86963773d554beaa6805.tar.gz ppe42-gcc-d9cdeb775555050bc79c86963773d554beaa6805.zip | |
PR c++/25010
* ipa-inline.c (cgraph_clone_inlined_nodes): Do not assume that
DECL_EXTERNAL functions have no bodies. Tidy.
PR c++/25010
* g++.dg/opt/inline10.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108375 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ipa-inline.c | 36 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/g++.dg/opt/inline10.C | 20 |
3 files changed, 44 insertions, 17 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index c16e9475a02..ceadb23261f 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -115,24 +115,26 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to, void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original) { - struct cgraph_node *n; - - /* We may eliminate the need for out-of-line copy to be output. In that - case just go ahead and re-use it. */ - if (!e->callee->callers->next_caller - && (!e->callee->needed || DECL_EXTERNAL (e->callee->decl)) - && duplicate - && flag_unit_at_a_time) + if (duplicate) { - gcc_assert (!e->callee->global.inlined_to); - if (!DECL_EXTERNAL (e->callee->decl)) - overall_insns -= e->callee->global.insns, nfunctions_inlined++; - duplicate = 0; - } - else if (duplicate) - { - n = cgraph_clone_node (e->callee, e->count, e->loop_nest, update_original); - cgraph_redirect_edge_callee (e, n); + /* We may eliminate the need for out-of-line copy to be output. + In that case just go ahead and re-use it. */ + if (!e->callee->callers->next_caller + && !e->callee->needed + && flag_unit_at_a_time) + { + gcc_assert (!e->callee->global.inlined_to); + if (DECL_SAVED_TREE (e->callee->decl)) + overall_insns -= e->callee->global.insns, nfunctions_inlined++; + duplicate = false; + } + else + { + struct cgraph_node *n; + n = cgraph_clone_node (e->callee, e->count, e->loop_nest, + update_original); + cgraph_redirect_edge_callee (e, n); + } } if (e->caller->global.inlined_to) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5edcf7d2e5e..28b6eda6d56 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-12-10 Mark Mitchell <mark@codesourcery.com> + + PR c++/25010 + * g++.dg/opt/inline10.C: New test. + 2005-12-11 Steven G. Kargl <kargls@comcast.net> * gfortran.dg/g77/19981216-0.f: Fix for fortran/25068. diff --git a/gcc/testsuite/g++.dg/opt/inline10.C b/gcc/testsuite/g++.dg/opt/inline10.C new file mode 100644 index 00000000000..086a481286a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/inline10.C @@ -0,0 +1,20 @@ +// PR c++/25010 +// { dg-options "-O2" } + +#pragma interface + +struct T +{ + T *p; + + void baz () + { + p->baz (); + } +}; + +void foo (T *p) +{ + p->baz (); +} + |

