[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