Hi, Currently when we expand thunk in inliner we assume its body has a single call. This is wrong for cases when thunk is instrumented. It means we might try to continue inlining for wrong edge. This simple patch fixes it.
Bootstrapped and regtested on x86_64-unknown-linux-gnu. OK for trunk? Thanks, Ilya -- gcc/ 2016-07-11 Ilya Enkovich <ilya.enkov...@intel.com> PR ipa/71633 * ipa-inline-transform.c (inline_call): Support instrumented thunks. gcc/testsuite/ 2016-07-11 Ilya Enkovich <ilya.enkov...@intel.com> PR ipa/71633 * g++.dg/pr71633.C: New test. diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 9ac1efc..a4ae305 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -319,10 +319,14 @@ inline_call (struct cgraph_edge *e, bool update_original, to = to->global.inlined_to; if (to->thunk.thunk_p) { + struct cgraph_node *target = to->callees->callee; if (in_lto_p) to->get_untransformed_body (); to->expand_thunk (false, true); - e = to->callees; + /* When thunk is instrumented we may have multiple callees. */ + for (e = to->callees; e && e->callee != target; e = e->next_callee) + ; + gcc_assert (e); } diff --git a/gcc/testsuite/g++.dg/pr71633.C b/gcc/testsuite/g++.dg/pr71633.C new file mode 100644 index 0000000..bb69bbb --- /dev/null +++ b/gcc/testsuite/g++.dg/pr71633.C @@ -0,0 +1,28 @@ +/* PR71633 */ +// { dg-do compile { target i?86-*-* x86_64-*-* } } +/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */ + +class c1 +{ + virtual void fn1 (); +}; + +class c2 +{ + virtual int *fn2 () const; +}; + +class c3 : c1, c2 +{ + int *fn2 () const; + int *fn3 (int) const; +}; + +int *c3::fn2 () const +{ +} + +int *c3::fn3 (int p) const +{ + return fn3 (p); +}