diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 36b65df50c5..41054b54b38 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -11328,17 +11328,14 @@ aarch64_valid_fp_move (rtx dst, rtx src, machine_mode mode) if (MEM_P (src)) return true; - if (!DECIMAL_FLOAT_MODE_P (mode)) - { - if (aarch64_can_const_movi_rtx_p (src, mode) - || aarch64_float_const_representable_p (src) - || aarch64_float_const_zero_rtx_p (src)) - return true; + if (aarch64_can_const_movi_rtx_p (src, mode) + || aarch64_float_const_representable_p (src) + || aarch64_float_const_zero_rtx_p (src)) + return true; - /* Block FP immediates which are split during expand. */ - if (aarch64_float_const_rtx_p (src)) - return false; - } + /* Block FP immediates which are split during expand. */ + if (aarch64_float_const_rtx_p (src)) + return false; return can_create_pseudo_p (); } @@ -25611,6 +25608,10 @@ aarch64_float_const_representable_p (rtx x) { x = unwrap_const_vec_duplicate (x); machine_mode mode = GET_MODE (x); + + if (DECIMAL_FLOAT_MODE_P (mode)) + return false; + if (!CONST_DOUBLE_P (x)) return false; diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 03188a64ab1..031e621c98a 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -1762,8 +1762,7 @@ && aarch64_float_const_zero_rtx_p (operands[1]))) operands[1] = force_reg (mode, operands[1]); - if (!DECIMAL_FLOAT_MODE_P (mode) - && GET_CODE (operands[1]) == CONST_DOUBLE + if (GET_CODE (operands[1]) == CONST_DOUBLE && can_create_pseudo_p () && !aarch64_can_const_movi_rtx_p (operands[1], mode) && !aarch64_float_const_representable_p (operands[1]) diff --git a/gcc/testsuite/gcc.dg/torture/pr119131-1.c b/gcc/testsuite/gcc.dg/torture/pr119131-1.c new file mode 100644 index 00000000000..c62f702f98c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr119131-1.c @@ -0,0 +1,31 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target dfp } */ +/* PR target/119131 */ + +typedef __attribute__((__vector_size__ (64))) char C; +typedef __attribute__((__vector_size__ (64))) _Decimal32 D; +int a, b; +_Decimal32 f; +C e; +C c; + +void +foo (D d) +{ + d -= *(_Decimal32 *) __builtin_memset (&f, 0, 4); + b += a; + if (a) + b /= 0; /* { dg-warning "division by zero" } */ + c = (C) d + e; +} + +void +foo1 (D d) +{ + __builtin_memset (&f, 0, 4); + d -= *(_Decimal32 *)&f; + b += a; + if (a) + b /= 0;/* { dg-warning "division by zero" } */ + c = (C) d + e; +}