This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug middle-end/20991] [4.0/4.1 Regression] ICE in cgraph_mark_reachable_node


------- 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]