This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/20991] [4.0/4.1 Regression] ICE in cgraph_mark_reachable_node
- From: "matz at suse dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 15 Apr 2005 03:16:08 -0000
- Subject: [Bug middle-end/20991] [4.0/4.1 Regression] ICE in cgraph_mark_reachable_node
- References: <20050413132503.20991.jakub@gcc.gnu.org>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Additional Comments From matz at suse dot de 2005-04-15 03:16 -------
One strange thing is, that the call to getWidth() in B is already in .generic:
if (retval.1)
{
getWidth (&i_bnds);
}
while the call to getWidth() in isEmpty() (which is inlined later into B()) is
D.1595 = this->_vptr.IMG_Rect;
D.1596 = *D.1595;
D.1597 = OBJ_TYPE_REF(D.1596;this->0) (this);
D.1594 = D.1597 == 0;
Both are actually virtual calls of course, so I wonder why they are represented
differently. Note that this doesn't change if I make B() a method of IMG_Rect.
I thought initially that might be a difference, as isEmpty is one.
Another fact is, that if I comment out the totally unrelated useless decl for
getVisibility(), it works. The .i01.cgraph dump in that case shows these
Initial entry points: void B() void A()
Unit entry points: void B() void A() virtual bool IMG_Rect::isEmpty() const
virtual int IMG_Rect::getWidth() const
while when it breaks (i.e. when getVisibility is there) it looks like:
Initial entry points: void B() void A()
Unit entry points: void B() void A()
See how the two methods in question are now missing. As they are declared inline this
actually should be okay, and that getVisibility makes a difference might be another bug,
which hides this one sometimes.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20991