On 05/16/2016 12:22 AM, Jan Hubicka wrote:
> Hi,
> this patch teach inliner to inline into thunks. This is easy to do - all we 
> need
> is to produce a gimple body when we decide to do so. This fixes some ages old 
> xfails
> and enables some 40k inlines in Firefox. Not all those inlines are win, 
> because
> the codst model of thunks is wrong.  We need to model that thunk calls are 
> really just
> simple jumps. I will do that incrementally.
> 
> Bootstrapped/regtested x86_64-linux, will commit it tomorrow.

Hi Honza.

I've spotted a new ICE after I've applied all your patches (4) related
to thunk expansion.

tc.ii:13:80: error: Thunk is not supposed to have body
 int C::m_fn2(B &p1, int p2, int p3, int &p4) { m_fn1()->m_fn2(p1, p2, p3, p4); 
}
                                                                                
^
_ZThn8_N1C5m_fn2ER1BiiRi/37 (virtual int C::_ZThn8_N1C5m_fn2ER1BiiRi(B&, int, 
int, int&)) @0x7fc693311450
  Type: function definition analyzed
  Visibility: public virtual artificial
  next sharing asm name: 35
  References: 
  Referring: 
  Function virtual int C::_ZThn8_N1C5m_fn2ER1BiiRi(B&, int, int, int&)/37 is 
inline copy in virtual int C::m_fn2(B&, int, int, int&)/0
  Clone of _ZThn8_N1C5m_fn2ER1BiiRi/19
  Availability: local
  First run: 0
  Function flags: body local
  Thunk fixed offset -8 virtual value 0 has virtual offset 0)
  Called by: _ZN1C5m_fn2ER1BiiRi/36 (speculative) (inlined) (0.33 per call) 
(can throw external) 
  Calls: *.LTHUNK0/1 (0.33 per call) (can throw external) 
tc.ii:13:80: internal compiler error: verify_cgraph_node failed
0xb3258f cgraph_node::verify_node()
        ../../gcc/cgraph.c:3444
0xb20acb symtab_node::verify()
        ../../gcc/symtab.c:1177
0xb20b54 symtab_node::verify_symtab_nodes()
        ../../gcc/symtab.c:1197
0xb40bc6 symtab_node::checking_verify_symtab_nodes()
        ../../gcc/cgraph.h:614
0xdc9bc2 symbol_table::remove_unreachable_nodes(_IO_FILE*)
        ../../gcc/ipa.c:690
0x178f732 ipa_inline
        ../../gcc/ipa-inline.c:2444
0x179038e execute
        ../../gcc/ipa-inline.c:2848

Thanks,
Martin
class A;
class B {
public:
  virtual A *m_fn1();
};
class A {
public:
  virtual int m_fn2(B &, int, int, int &) = 0;
};
class C : B, A {
  int m_fn2(B &, int, int, int &);
};
int C::m_fn2(B &p1, int p2, int p3, int &p4) { m_fn1()->m_fn2(p1, p2, p3, p4); }

Reply via email to