On Sat, Jun 29, 2013 at 12:55 AM, Sriraman Tallam <[email protected]> wrote:
> Inlining sse* functions into avx is broken? Here is an example:
>
> __attribute__((always_inline,target("sse3")))
> inline int callee ()
> {
> return 0;
> }
>
> __attribute__((target("avx")))
> inline int caller ()
> {
> return callee ();
> }
>
> main ()
> {
> return caller ();
> }
>
> $ g++ -O2 foo.cc
> error: inlining failed in call to always_inline 'int callee()': target
> specific option mismatch
>
> This patch fixes the problem:
>
> Index: gcc/config/i386/i386.c
> ===================================================================
> --- gcc/config/i386/i386.c (revision 200497)
> +++ gcc/config/i386/i386.c (working copy)
> @@ -4520,8 +4520,9 @@ ix86_can_inline_p (tree caller, tree callee)
> != callee_opts->x_ix86_isa_flags)
> ret = false;
>
> - /* See if we have the same non-isa options. */
> - else if (caller_opts->x_target_flags != callee_opts->x_target_flags)
> + /* Callee's non-isa options should be a subset of the caller's. */
> + else if ((caller_opts->x_target_flags & callee_opts->x_target_flags)
> + != callee_opts->x_target_flags)
> ret = false;
>
>
> Setting avx as ISA has side-effects on some target flags and directly
> comparing them seems incorrect. This is also breaking the usage of
> mmintrinsic headers. An intrinsic in avxintrin.h is calling an
> intrinsic in another header. The call is not inlinable for the same
> reason.
>
> Is this ok?
This looks correct to me.
Do we need to backport this change?
Uros.