Emit errors when always_inline functions cannot be inlined in -O0 mode.
authorSriraman Tallam <tmsriram@google.com>
Tue, 18 Jun 2013 22:45:03 +0000 (22:45 +0000)
committerSriraman Tallam <tmsriram@gcc.gnu.org>
Tue, 18 Jun 2013 22:45:03 +0000 (22:45 +0000)
* tree-inline.c (expand_call_inline): Allow the error to be flagged
in early inline pass.
* ipa-inline.c (inline_always_inline_functions): Pretend always_inline
functions are inlined during failures to flag an error.
* gcc.target/i386/inline_error.c: New test.
* gcc.c-torture/compile/pr44043.c: Fix test to expect an error.
* gcc.c-torture/compile/pr43791.c: Fix test to expect an error.

From-SVN: r200179

gcc/ChangeLog
gcc/ipa-inline.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr43791.c
gcc/testsuite/gcc.c-torture/compile/pr44043.c
gcc/testsuite/gcc.target/i386/inline_error.c [new file with mode: 0644]
gcc/tree-inline.c

index 20f42b1..d82677b 100644 (file)
@@ -1,3 +1,10 @@
+2013-06-18  Sriraman Tallam  <tmsriram@google.com>
+
+       * ipa-inline.c (inline_always_inline_functions): Pretend always_inline
+       functions are inlined during failures to flag an error.
+       * tree-inline.c (expand_call_inline): Allow the error to be flagged
+       in early inline pass.
+       
 2013-06-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.c (initial_ix86_tune_features): Fix a typo
index 5d50bb4..d1f0089 100644 (file)
@@ -1911,7 +1911,15 @@ inline_always_inline_functions (struct cgraph_node *node)
        }
 
       if (!can_early_inline_edge_p (e))
-       continue;
+       {
+         /* Set inlined to true if the callee is marked "always_inline" but
+            is not inlinable.  This will allow flagging an error later in
+            expand_call_inline in tree-inline.c.  */
+         if (lookup_attribute ("always_inline",
+                                DECL_ATTRIBUTES (callee->symbol.decl)) != NULL)
+           inlined = true;
+         continue;
+       }
 
       if (dump_file)
        fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
index 53b844f..be51cb3 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-18  Sriraman Tallam  <tmsriram@google.com>
+
+       * gcc.target/i386/inline_error.c: New test.
+       * gcc.c-torture/compile/pr44043.c: Fix test to expect an error.
+       * gcc.c-torture/compile/pr43791.c: Fix test to expect an error.
+
 2013-06-18  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/53211
index 38cb3c8..0d8c94f 100644 (file)
@@ -19,3 +19,4 @@ void trylock(void) {
      fasttrylock(slowtrylock);
 }
 
+/* { dg-prune-output "(inlining failed in call to always_inline.*indirect function call with a yet undetermined callee|called from here)" } */
index 943501b..ea87678 100644 (file)
@@ -85,3 +85,5 @@ int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 {
   raw_send_hdrinc(sk, msg->msg_iov, len, (void *)0, msg->msg_flags);
 }
+
+/* { dg-prune-output "(inlining failed in call to always_inline.*indirect function call with a yet undetermined callee|called from here)" } */
diff --git a/gcc/testsuite/gcc.target/i386/inline_error.c b/gcc/testsuite/gcc.target/i386/inline_error.c
new file mode 100644 (file)
index 0000000..da1cea1
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O0 -mno-popcnt" } */
+
+inline int __attribute__ ((__gnu_inline__, __always_inline__, target("popcnt")))
+foo () /* { dg-error "inlining failed in call to always_inline .* target specific option mismatch" } */
+{
+  return 0;
+}
+
+int bar()
+{
+  return foo (); /* { dg-error "called from here" } */
+}
index bee7766..f524771 100644 (file)
@@ -3905,8 +3905,6 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
             for inlining, but we can't do that because frontends overwrite
             the body.  */
          && !cg_edge->callee->local.redefined_extern_inline
-         /* Avoid warnings during early inline pass. */
-         && cgraph_global_info_ready
          /* PR 20090218-1_0.c. Body can be provided by another module. */
          && (reason != CIF_BODY_NOT_AVAILABLE || !flag_generate_lto))
        {