From: jamborm Date: Tue, 15 Dec 2015 13:07:15 +0000 (+0000) Subject: [PR 68851] Do not collect thunks in collect_callers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6bd593a94b0244afab4e6900de26fb17b399dfe;p=thirdparty%2Fgcc.git [PR 68851] Do not collect thunks in collect_callers 2015-12-15 Martin Jambor PR ipa/68851 * cgraph.c (collect_callers_of_node_1): Do not collect thunks. * cgraph.h (cgraph_node): Change comment of collect_callers. testsuite/ * g++.dg/ipa/pr68851.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231648 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e36f0ed603ec..9b81b4818f23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-15 Martin Jambor + + PR ipa/68851 + * cgraph.c (collect_callers_of_node_1): Do not collect thunks. + * cgraph.h (cgraph_node): Change comment of collect_callers. + 2015-12-15 Jakub Jelinek PR tree-optimization/66688 diff --git a/gcc/cgraph.c b/gcc/cgraph.c index c8c337026128..5a9c2a2d928f 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2592,7 +2592,8 @@ collect_callers_of_node_1 (cgraph_node *node, void *data) if (avail > AVAIL_INTERPOSABLE) for (cs = node->callers; cs != NULL; cs = cs->next_caller) - if (!cs->indirect_inlining_edge) + if (!cs->indirect_inlining_edge + && !cs->caller->thunk.thunk_p) redirect_callers->safe_push (cs); return false; } diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 0a093913be64..ba14215ed6f1 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -1070,7 +1070,7 @@ public: cgraph_edge *get_edge (gimple *call_stmt); /* Collect all callers of cgraph_node and its aliases that are known to lead - to NODE (i.e. are not overwritable). */ + to NODE (i.e. are not overwritable) and that are not thunks. */ vec collect_callers (void); /* Remove all callers from the node. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4d749f1d1f26..d08b40046e23 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-15 Martin Jambor + + PR ipa/68851 + * g++.dg/ipa/pr68851.C: New test. + 2015-12-15 Paolo Carlini PR c++/63506 diff --git a/gcc/testsuite/g++.dg/ipa/pr68851.C b/gcc/testsuite/g++.dg/ipa/pr68851.C new file mode 100644 index 000000000000..659e4cdcc4a1 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr68851.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-options "-O3" } + +class A; +class B { +public: + operator A *() const; +}; +class A { +public: + virtual bool isFormControlElement() const {} +}; +class C { + struct D { + B element; + }; + bool checkPseudoClass(const D &, int &) const; +}; +class F { + virtual bool isFormControlElement() const; +}; +class G : A, F { + bool isFormControlElement() const {} +}; +bool C::checkPseudoClass(const D &p1, int &) const { + A &a = *p1.element; + a.isFormControlElement(); + a.isFormControlElement() || a.isFormControlElement(); +}