From: Martin Jambor Date: Fri, 8 Jan 2016 12:34:34 +0000 (+0100) Subject: [PR 68851] Do not collect thunks in collect_callers X-Git-Tag: releases/gcc-4.9.4~412 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9997ac1aba070374050cd41dcd9f8917dedaaa67;p=thirdparty%2Fgcc.git [PR 68851] Do not collect thunks in collect_callers 2016-01-08 Martin Jambor PR ipa/68851 gcc/ * cgraph.c (collect_callers_of_node_1): Do not collect thunks. (collect_callers): Change comment. testsuite/ * g++.dg/ipa/pr68851.C: New test. From-SVN: r232160 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db40b82864d0..ef95ce489ced 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-01-08 Martin Jambor + + Backport from mainline + 2015-12-15 Martin Jambor + + PR ipa/68851 + * cgraph.c (collect_callers_of_node_1): Do not collect thunks. + (collect_callers): Change comment. + 2015-12-25 Andreas Tobler Backport from mainline diff --git a/gcc/cgraph.c b/gcc/cgraph.c index ac9b460370b1..a12b136a7fbf 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2527,13 +2527,14 @@ collect_callers_of_node_1 (struct cgraph_node *node, void *data) if (avail > AVAIL_OVERWRITABLE) 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; } /* Collect all callers of NODE and its aliases that are known to lead to NODE - (i.e. are not overwritable). */ + (i.e. are not overwritable) and that are not thunks. */ vec collect_callers_of_node (struct cgraph_node *node) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 07a2e81b1947..d1637d7ea7e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-01-08 Martin Jambor + + Backport from mainline + 2015-12-15 Martin Jambor + + PR ipa/68851 + * g++.dg/ipa/pr68851.C: New test. + 2015-12-22 Peter Bergner Backport from mainline 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(); +}