[Bug rtl-optimization/80425] Extra inter-unit register move with zero-extension

ubizjak at gmail dot com gcc-bugzilla@gcc.gnu.org
Mon May 15 09:49:00 GMT 2017


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

--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Uroš Bizjak from comment #1)
> Looks like RA issue.

A related problem is shown with:

extern int a;
__m512i
f1 (__m512i x)
{
  return _mm512_srai_epi32 (x, a);
}

compiled with -O2 -mavx512f:

        movl    a(%rip), %eax   # 7     *zero_extendsidi2/4     [length = 6]
        movq    %rax, -56(%rbp) # 21    *movdi_internal/6       [length = 4]
        vmovq   -56(%rbp), %xmm1        # 22    *movdi_internal/15      [length
= 7]
        vpsrad  %xmm1, %zmm0, %zmm0     # 12    ashrv16si3/1    [length = 6]

Please note that GR->xmm moves are disabled by default. In this case, we could
extend from mem->xmm, but RA choose general register instead.

This happens even with the following patch that removes "?" from relevant
insns:

--cut here--
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index da79d8f..a1ff7c9 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3762,10 +3762,10 @@

 (define_insn "*zero_extendsidi2"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-               "=r,?r,?o,r   ,o,?*Ym,?!*y,?r ,?r,?*Yi,?*x,?*x,?*v,*r")
+               "=r,?r,?o,r   ,o,?*Ym,?!*y,?r ,?r,?*Yi,*x,*x,*v,*r")
        (zero_extend:DI
         (match_operand:SI 1 "x86_64_zext_operand"
-               "0 ,rm,r ,rmWz,0,r   ,m   ,*Yj,*x,r   ,m  , *x, *v,*k")))]
+               "0 ,rm,r ,rmWz,0,r   ,m   ,*Yj,*x,r   ,m ,*x,*v,*k")))]
   ""
 {
   switch (get_attr_type (insn))
--cut here--

-m32 generates optimal code w and w/o patch:

        vmovd   a, %xmm1        # 7     *zero_extendsidi2/11    [length = 11]
        vpsrad  %xmm1, %zmm0, %zmm0     # 12    ashrv16si3/1    [length = 6]


More information about the Gcc-bugs mailing list