Hi!

The following testcase ICEs, because the aarch64_cmeqdf instruction
starting with r256612 no longer accepts CONST0_RTX (E_DFmode) as
valid argument, but the expander generates it anyway.

The bug has been introduced during the addition of aarch64_simd_imm_zero
and aarch64_simd_or_scalar_imm_zero predicates, before the predicate
used to be:
(define_predicate "aarch64_simd_reg_or_zero"
  (and (match_code "reg,subreg,const_int,const_double,const_vector")
       (ior (match_operand 0 "register_operand")
           (ior (match_test "op == const0_rtx")
                (match_test "aarch64_simd_imm_zero_p (op, mode)")))))
with
bool
aarch64_simd_imm_zero_p (rtx x, machine_mode mode)
{
  return x == CONST0_RTX (mode);
}
and so matched not just const,const_vector zeros, but also
const_int zero (that is through op == const0_rtx) and const_double
zero too.

Bootstrapped/regtested on aarch64-linux (scratch Fedora gcc 8 package build
with the patch applied), ok for trunk?

2018-02-27  Jakub Jelinek  <ja...@redhat.com>

        PR fortran/84565
        * config/aarch64/predicates.md (aarch64_simd_reg_or_zero): Use
        aarch64_simd_or_scalar_imm_zero rather than aarch64_simd_imm_zero.

        * gfortran.dg/pr84565.f90: New test.

--- gcc/config/aarch64/predicates.md.jj 2018-02-06 13:13:06.305751221 +0100
+++ gcc/config/aarch64/predicates.md    2018-02-26 16:30:01.902195208 +0100
@@ -395,7 +395,7 @@ (define_predicate "aarch64_simd_reg_or_z
   (and (match_code "reg,subreg,const_int,const_double,const,const_vector")
        (ior (match_operand 0 "register_operand")
            (match_test "op == const0_rtx")
-           (match_operand 0 "aarch64_simd_imm_zero"))))
+           (match_operand 0 "aarch64_simd_or_scalar_imm_zero"))))
 
 (define_predicate "aarch64_simd_struct_operand"
   (and (match_code "mem")
--- gcc/testsuite/gfortran.dg/pr84565.f90.jj    2018-02-26 16:32:49.912271950 
+0100
+++ gcc/testsuite/gfortran.dg/pr84565.f90       2018-02-26 16:31:15.423223943 
+0100
@@ -0,0 +1,7 @@
+! PR fortran/84565
+! { dg-do compile { target aarch64*-*-* } }
+! { dg-options "-mlow-precision-sqrt -funsafe-math-optimizations" }
+subroutine mysqrt(a)
+ real(KIND=KIND(0.0D0)) :: a
+ a=sqrt(a)
+end subroutine

        Jakub

Reply via email to