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" } */ +}