re PR tree-optimization/51039 (ICE: in estimate_function_body_sizes, at ipa-inline...
authorRichard Guenther <rguenther@suse.de>
Wed, 9 Nov 2011 13:43:02 +0000 (13:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 9 Nov 2011 13:43:02 +0000 (13:43 +0000)
2011-11-09  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/51039
* tree-cfg.c (verify_gimple_call): Verify that
gimple_call_cannot_inline_p is returning a conservative
correct result according to gimple_check_call_matching_types.
* ipa-inline-analysis.c (estimate_function_body_sizes): Remove
code dealing with un-inlinablility.
* gimple-streamer-in.c (input_gimple_stmt): Update the
non-inlinable flag.

* gcc.dg/pr51039.c: New testcase.

From-SVN: r181205

gcc/ChangeLog
gcc/gimple-streamer-in.c
gcc/ipa-inline-analysis.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr51039.c [new file with mode: 0644]
gcc/tree-cfg.c

index 20307dd..63da104 100644 (file)
@@ -1,6 +1,17 @@
 2011-11-09  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/51039
+       * tree-cfg.c (verify_gimple_call): Verify that
+       gimple_call_cannot_inline_p is returning a conservative
+       correct result according to gimple_check_call_matching_types.
+       * ipa-inline-analysis.c (estimate_function_body_sizes): Remove
+       code dealing with un-inlinablility.
+       * gimple-streamer-in.c (input_gimple_stmt): Update the
+       non-inlinable flag.
+
+2011-11-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/51039
        * tree-inline.c (setup_one_parameter): Always perform a
        valid gimple type change.
        (declare_return_variable): Likewise.
index fc6ceb4..862c5b0 100644 (file)
@@ -219,11 +219,18 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
        }
       if (is_gimple_call (stmt))
        {
+         tree fndecl;
          if (gimple_call_internal_p (stmt))
            gimple_call_set_internal_fn
              (stmt, streamer_read_enum (ib, internal_fn, IFN_LAST));
          else
            gimple_call_set_fntype (stmt, stream_read_tree (ib, data_in));
+         /* Update the non-inlinable flag conservatively.  */
+         fndecl = gimple_call_fndecl (stmt);
+         if (fndecl
+             && !gimple_call_cannot_inline_p (stmt)
+             && !gimple_check_call_matching_types (stmt, fndecl))
+           gimple_call_set_cannot_inline (stmt, true);
        }
       break;
 
index 1820b0c..91aa612 100644 (file)
@@ -1961,20 +1961,6 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early)
              es->call_stmt_time = this_time;
              es->loop_depth = bb->loop_depth;
              edge_set_predicate (edge, &bb_predicate);
-
-             /* Do not inline calls where we cannot triviall work around
-                mismatches in argument or return types.  */
-             if (edge->callee
-                 && cgraph_function_or_thunk_node (edge->callee, NULL)
-                 && !gimple_check_call_matching_types
-                      (stmt, cgraph_function_or_thunk_node (edge->callee,
-                       NULL)->decl))
-               {
-                 edge->call_stmt_cannot_inline_p = true;
-                 gimple_call_set_cannot_inline (stmt, true);
-               }
-             else
-               gcc_assert (!gimple_call_cannot_inline_p (stmt));
            }
 
          /* TODO: When conditional jump or swithc is known to be constant, but
index 66a534b..2d4a6aa 100644 (file)
@@ -1,3 +1,8 @@
+2011-11-09  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/51039
+       * gcc.dg/pr51039.c: New testcase.
+
 2011-11-09  Jakub Jelinek  <jakub@redhat.com>
 
        * lib/target-supports.exp (check_effective_target_vect_cond_mixed):
diff --git a/gcc/testsuite/gcc.dg/pr51039.c b/gcc/testsuite/gcc.dg/pr51039.c
new file mode 100644 (file)
index 0000000..863a6ff
--- /dev/null
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O -finline-small-functions -fno-ipa-pure-const" } */
+
+float baz (void)
+{
+  return 0;
+}
+
+static inline int bar (int (*ibaz) (void))
+{
+  return ibaz ();
+}
+
+void foo (void)
+{
+  bar((int (*)(void))baz);
+}
index d81cc67..b733c88 100644 (file)
@@ -3227,6 +3227,16 @@ verify_gimple_call (gimple stmt)
        }
     }
 
+  /* Verify that if we have a direct call and the argument/return
+     types have mismatches the call is properly marked as noninlinable.  */
+  if (fndecl
+      && !gimple_call_cannot_inline_p (stmt)
+      && !gimple_check_call_matching_types (stmt, fndecl))
+    {
+      error ("gimple call cannot be inlined but is not marked so");
+      return true;
+    }
+
   return false;
 }