Message ID | CAAs8HmxeUw1OADPuJQsWeAAc7p6RJpbFxUUo_91doz4EAbx_Ug@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Mon, Jun 17, 2013 at 10:49 AM, Sriraman Tallam <tmsriram@google.com> wrote: > On Fri, Jun 14, 2013 at 11:08 AM, Sriraman Tallam <tmsriram@google.com> wrote: >> On Fri, Jun 14, 2013 at 1:43 AM, Richard Biener >> <richard.guenther@gmail.com> wrote: >>> On Fri, Jun 14, 2013 at 4:52 AM, Sriraman Tallam <tmsriram@google.com> wrote: >>>> On Thu, Jun 13, 2013 at 12:40 PM, Jan Hubicka <hubicka@ucw.cz> wrote: >>>>>> * 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. >>>> >>>>> This patch is OK if it passes testing. >>>> >>>> Two tests gcc.c-torture/compile/pr43791.c and pr44043.c are failing >>>> because of always_inline functions being present that cannot be >>>> inlined and the compiler is now generating error messages. I will fix >>>> them and resend the patch. >>> >>> Quick look - pr43791.c is not expected to work at -O0, so skip -O0 >>> for example by guarding the whole thing with #if __OPTIMIZED__ > 0. >>> Similar for pr44043.c. >> >> Seems like __OPTIMIZED__ is not defined in my config, dont know why. I >> see other tests checking for __OPTIMIZED. >> >> I fixed these two tests by adding a dg-prune-output at the end. Is >> that reasonable? I have attached the patch with all tests passing now. > > I have attached the latest patch with a small error in the previous > patch fixed. I will submit this patch if there are no objections. I have committed this patch. Thanks Sri > > Thanks > Sri > >> >> Thanks >> Sri >> >>> >>> That we didn't error at -O0 before is a bug. Eventually I was suggesting >>> to error if we end up outputting the body of an always_inline function, >>> that is, any uses remain (including indirect calls or address-takens which >>> is where we do not error right now). >>> >>> Richard. >>> >>>> Thanks >>>> Sri >>>> >>>>> Thanks for your patience! >>>> >>>> >>>> >>>>> >>>>> Honza
Index: testsuite/gcc.c-torture/compile/pr44043.c =================================================================== --- testsuite/gcc.c-torture/compile/pr44043.c (revision 200034) +++ testsuite/gcc.c-torture/compile/pr44043.c (working copy) @@ -85,3 +85,5 @@ int raw_sendmsg(struct sock *sk, struct msghdr *ms { 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)" } */ Index: testsuite/gcc.c-torture/compile/pr43791.c =================================================================== --- testsuite/gcc.c-torture/compile/pr43791.c (revision 200034) +++ testsuite/gcc.c-torture/compile/pr43791.c (working copy) @@ -1,3 +1,4 @@ + int owner(); int clear(); @@ -18,4 +19,4 @@ void fasttrylock(void (*slowfn)()) { 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: 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" } */ +} 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: 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)) {