Bootstrapped (with BOOT_CFLAGS='-g -O2 -Wno-error=maybe-uninitialized')
and regtested on s390x-redhat-linux. Ok for master?



Certain alternatives of *vec_tf_to_v1tf use "v" constraint for its
TFmode source operand. Therefore it is assigned to VEC_REGS class, and
when it is reloaded using *movtf_64, whose relevant alternatives need
FP_REGS, LRA loops and ICE happens. The reason is that register class
mismatch causes LRA to emit another reload, which triggers this issue
again.

Fix by using "f" constraint, which is more appropriate for FP register
pairs anyway.

gcc/ChangeLog:

2020-09-02  Ilya Leoshkevich  <i...@linux.ibm.com>

        * config/s390/vector.md(*vec_tf_to_v1tf): Use "f" instead of "v"
          for the source operand.
---
 gcc/config/s390/vector.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/config/s390/vector.md b/gcc/config/s390/vector.md
index 131bbda09bc..2573b7d980a 100644
--- a/gcc/config/s390/vector.md
+++ b/gcc/config/s390/vector.md
@@ -567,7 +567,7 @@ (define_insn "*vec_splats_bswap_elem<mode>"
 ; single vector register.
 (define_insn "*vec_tf_to_v1tf"
   [(set (match_operand:V1TF                   0 "nonimmediate_operand" 
"=v,v,R,v,v")
-       (vec_duplicate:V1TF (match_operand:TF 1 "general_operand"       
"v,R,v,G,d")))]
+       (vec_duplicate:V1TF (match_operand:TF 1 "general_operand"       
"f,R,f,G,d")))]
   "TARGET_VX"
   "@
    vmrhg\t%v0,%1,%N1
-- 
2.25.4

Reply via email to