[PATCH, PR ipa/71633] Fix inlining into thunks

Ilya Enkovich enkovich.gnu@gmail.com
Mon Jul 11 10:25:00 GMT 2016


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.enkovich@intel.com>

	PR ipa/71633
	* ipa-inline-transform.c (inline_call): Support
	instrumented thunks.

gcc/testsuite/

2016-07-11  Ilya Enkovich  <ilya.enkovich@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);
+}



More information about the Gcc-patches mailing list