[Bug target/81763] Issues with BMI on 32bit x86 apps on GCC 7.1+

jakub at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jan 26 09:00:00 GMT 2018


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

--- Comment #40 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #37)
> (In reply to Jakub Jelinek from comment #33)
> 
> > and it should work.  The last case would be right now:
> >   SI:N+1 = SI:N &~ SI:N+2; SI:N+2 = SI:N+1 &~ SI:N+3;
> > and is again wrong, but we could again swap:
> >   SI:N+2 = SI:N+1 &~ SI:N+3; SI:N+1 = SI:N &~ SI:N+2;
> > and all is fine.
> 
> Whoops, it looks that SI:N+2 is clobbered in the swapped case.

You're right.  So the question is if IRA/LRA can ever allow that case where
there is partial overlap with both registers.  I've tried hard to simulate that
case with:
unsigned long long
foo (unsigned long long x, unsigned long long y)
{
  unsigned long long z;
  asm ("" : "+A" (x), "+Q" (y));
  z = x & ~y;
  asm ("" : "+Q" (z) : "a" (0), "b" (0));
  return z;
}
where IRA indeed allocates the used pseudos such that x is in ax:dx, y in cx:bx
and z in dx:cx.  Now, if I try this and testcase with ~x & y instead of x & ~y
with GCC patched with #c36, I get:
        andn    %eax, %ecx, %ecx
        xorl    %eax, %eax
        andn    %edx, %ebx, %ebx
        movl    %ecx, %edx
        movl    %ebx, %ecx
        movl    %eax, %ebx
resp.
        andn    %ecx, %eax, %ecx
        xorl    %eax, %eax
        andn    %ebx, %edx, %ebx
        movl    %ecx, %edx
        movl    %ebx, %ecx
        movl    %eax, %ebx
between the two inline asms, and if I leave just the =r <- (r, r) alternative
and nothing else, LRA ICEs on it (on both variants).  All is with -O2 -m32
-mbmi -mstv -msse2.  So, is there something in LRA that prevents these partial
overlaps?


More information about the Gcc-bugs mailing list