Hi,

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?

Thanks
Sri

Reply via email to