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