https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80298

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-04-04
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |uros at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The only problems from what I can see are with 64-bit code and the MMX/3dNOW
headers.  And the problem is that in x86-64 ABI the MMX vectors are passed and
returned in SSE registers, so even:
typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));

__m64 foo (__m64 x, __m64 y)
{
  return x + y;
}

fails to compile with -O2 -mno-sse -mmmx -m64.  The above fails correctly.
What I'm not sure about is:
typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));

__attribute__((always_inline)) inline __m64 foo (__m64 x, __m64 y)
{
  return x + y;
}

void
bar (__m64 *x, __m64 *y, __m64 *z)
{
  *x = foo (*y, *z);
}

Here we still error out, because foo has SSE return, but in reality as it is
always_inline inline function, we don't really care, the function must be
inlined.  So I wonder if ix86_function_value or functions it calls shouldn't
special case always_inline inline functions and internal functions (something I
ran into with -fsanitize=signed-integer-overflow on vectors, pointless -Wpsabi
warnings) and be quiet on them.

Reply via email to