On 2015.01.16 at 00:15 +0100, Jan Hubicka wrote: > Hi, > can_remove_node_now_p assumes that the node in question has no direct calls, > this > however is not checked in inline_call that leads to alias to be removed from > comdat group while it should not. > > Bootstrapped/regtested x86_64-linux, comitted.
Here's a testcase for this issue. OK for trunk? 2015-01-16 Markus Trippelsdorf <mar...@trippelsdorf.de> PR ipa/64163 PR ipa/64612 * g++.dg/ipa/pr64612.C: New test. /* { dg-do compile } */ /* { dg-options "-fPIC -O3 -std=c++11" } */ /* { dg-final { scan-assembler "_ZN5QListI7QStringED1Ev" } } */ class A { public: bool deref (); }; class QString; struct B { A ref; }; template <typename> class QList { B d; public: ~QList (); class const_iterator { }; const_iterator constBegin (); void clear (); void dealloc (); }; template <typename T> QList<T>::~QList () { if (d.ref.deref ()) dealloc (); } template <typename T> void QList<T>::clear () { QList (); } class A1 : public QList<QString> { }; class B1 { public: B1 (A1); }; struct F { void addMatch (const QString &&); A1 m_matchingMimeTypes; }; class G { A1 matchingGlobs (const QString &) const; }; void F::addMatch (const QString &&) { m_matchingMimeTypes.clear (); } A1 G::matchingGlobs (const QString &) const { A1 a; for (B1 b (a);;) ; } -- Markus