OSDN Git Service

2011-11-08 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Nov 2011 15:16:22 +0000 (15:16 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 8 Nov 2011 15:16:22 +0000 (15:16 +0000)
PR tree-optimization/51012
* ipa-prop.c (update_indirect_edges_after_inlining): Fixup
non-inlinable state.
* cgraph.c (cgraph_make_edge_direct): Likewise.

* gcc.dg/pr51012-1.c: New testcase.
* gcc.dg/pr51012-2.c: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181166 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraph.c
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr51012-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr51012-2.c [new file with mode: 0644]

index e5050e1..7db3a37 100644 (file)
@@ -1,3 +1,10 @@
+2011-11-08  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/51012
+       * ipa-prop.c (update_indirect_edges_after_inlining): Fixup
+       non-inlinable state.
+       * cgraph.c (cgraph_make_edge_direct): Likewise.
+
 2011-11-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR rtl-optimization/47698
index 2d226d4..44a950c 100644 (file)
@@ -1184,6 +1184,13 @@ cgraph_make_edge_direct (struct cgraph_edge *edge, struct cgraph_node *callee)
   /* Insert to callers list of the new callee.  */
   cgraph_set_edge_callee (edge, callee);
 
+  if (edge->call_stmt
+      && !gimple_check_call_matching_types (edge->call_stmt, callee->decl))
+    {
+      gimple_call_set_cannot_inline (edge->call_stmt, true);
+      edge->call_stmt_cannot_inline_p = true;
+    }
+
   /* We need to re-determine the inlining status of the edge.  */
   initialize_inline_failed (edge);
 }
index 7946aca..69f0453 100644 (file)
@@ -1905,6 +1905,13 @@ update_indirect_edges_after_inlining (struct cgraph_edge *cs,
       if (new_direct_edge)
        {
          new_direct_edge->indirect_inlining_edge = 1;
+         if (new_direct_edge->call_stmt
+             && !gimple_check_call_matching_types (new_direct_edge->call_stmt,
+                                                   new_direct_edge->callee->decl))
+           {
+             gimple_call_set_cannot_inline (new_direct_edge->call_stmt, true);
+             new_direct_edge->call_stmt_cannot_inline_p = true;
+           }
          if (new_edges)
            {
              VEC_safe_push (cgraph_edge_p, heap, *new_edges,
index 6fb865c..1a7528a 100644 (file)
@@ -1,5 +1,11 @@
 2011-11-08  Richard Guenther  <rguenther@suse.de>
 
+       PR tree-optimization/51012
+       * gcc.dg/pr51012-1.c: New testcase.
+       * gcc.dg/pr51012-2.c: Likewise.
+
+2011-11-08  Richard Guenther  <rguenther@suse.de>
+
        PR middle-end/51010
        * c-c++-common/uninit-pr51010.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/pr51012-1.c b/gcc/testsuite/gcc.dg/pr51012-1.c
new file mode 100644 (file)
index 0000000..36c788b
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile }  */
+/* { dg-options "-O2 -fno-early-inlining -fno-ipa-cp" } */
+
+float baz (void)
+{
+  return 0;
+}
+
+static inline int bar (int (*ibaz) (void))
+{
+  return ibaz ();
+}
+
+void foo (void)
+{
+  bar((int (*)(void))baz);
+}
diff --git a/gcc/testsuite/gcc.dg/pr51012-2.c b/gcc/testsuite/gcc.dg/pr51012-2.c
new file mode 100644 (file)
index 0000000..fcc8cea
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile }  */
+/* { dg-options "-O2 -fno-early-inlining" } */
+
+float baz (void)
+{
+  return 0;
+}
+
+static inline int bar (int (*ibaz) (void))
+{
+  return ibaz ();
+}
+
+void foo (void)
+{
+  bar((int (*)(void))baz);
+}