On Thu, Jun 13, 2013 at 10:19 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
>> On Thu, Jun 13, 2013 at 10:07 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
>> >> Can you create a helper function to flag the error and perhaps also
>> >> put that check inside can_inline_edge_p ?
>> >>
>> >> David
>> >>
>> >>
>> >> On Wed, Jun 12, 2013 at 6:00 PM, Sriraman Tallam <tmsri...@google.com> 
>> >> wrote:
>> >> > Hi Honza,
>> >> >
>> >> >    I have isolated the ipa-inline.c part into a separate patch with a
>> >> > test and attached it here. The patch  is simple. Could you please take
>> >> > a look?
>> >> >
>> >> >         * ipa-inline.c (can_early_inline_edge_p): Flag an error when
>> >> >         the function that cannot be inlined is target specific.
>> >> >         * gcc.target/i386/inline_error.c: New test.
>> >
>> > Sorry for taking ages to look at the patch, I was too hooked into other 
>> > problems.
>> > I also think can_early_inline_edge_p should not produce diagnostic - it is 
>> > supposed
>> > to be predicate.
>> >
>> > So your problem is that the hard worker in tree-inline is not called at -O0
>> > and thus errors are not output? I would suggest arranging 
>> > inline_always_inline_functions
>> > to return true even if inlining failed and thus making inline_calls to be 
>> > called.
>>
>> Thanks Honza!  Yes, that is the problem.  Should I just make it return
>> true for these special conditions (TARGET_MISMATCH + gnu_inline +
>> always_inline + ...)?
>
> Can't it just return true if there is any alwaysinline call?  I think if 
> inline fails,
> we always want to error, right?

Ok, patch attached that does this. Please let me know what you think.

Thanks
Sri

>
> Honza
        * 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.

Index: tree-inline.c
===================================================================
--- tree-inline.c       (revision 200034)
+++ tree-inline.c       (working copy)
@@ -3905,8 +3905,6 @@ expand_call_inline (basic_block bb, gimple stmt, c
             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))
        {
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 200034)
+++ ipa-inline.c        (working copy)
@@ -1911,7 +1911,15 @@ inline_always_inline_functions (struct cgraph_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: testsuite/gcc.target/i386/inline_error.c
===================================================================
--- testsuite/gcc.target/i386/inline_error.c    (revision 0)
+++ testsuite/gcc.target/i386/inline_error.c    (revision 0)
@@ -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" } */
+}

Reply via email to