[Bug target/78791] [7 regression] ACATS cxf2001 failure

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Dec 14 15:04:00 GMT 2016


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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-12-14
                 CC|                            |jakub at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Testcase transformed into something I can grok:

__attribute__((used, noinline, noclone)) unsigned long long
foo (unsigned long long x, unsigned long long y, unsigned long long z)
{
  unsigned long long a = x / y;
  unsigned long long b = x % y;
  a |= z;
  b ^= z;
  return a + b;
}

int
main ()
{
  if (foo (64, 7, 0) != 10
      || foo (28, 3, 2) != 14)
    __builtin_abort ();
  return 0;
}

Indeed, the
(mem/c:DI (plus:SI (reg/f:SI 20 frame) (const_int -8 [0xfffffffffffffff8])) [0 
S8 A64])
stack slot holds one of the two return values during the call (returned by
reference), and the stv2
pass reuses the same slot for storing the other DImode return value (from
%eax:%edx) into the stack, so that it can be loaded into a SSE register, before
the value from the call in the [frame-8] memory slot is loaded.


More information about the Gcc-bugs mailing list