aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-27 14:11:47 +0000
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-27 14:11:47 +0000
commita08577bce241e8a3caf3cd5d8680d398cfaeeb2c (patch)
treea07193beb04c39e7676aa6611abc7e9f7aec9ab1
parenta775bee3652dbe38648f6eb58ba3d23bee5a1546 (diff)
[AArch64] Fix for gcc-7 regression PR 80530
This patch fixes the regression caused by the changes to add square root estimation when compiling for xgene-1 or exynos-m1 targets. The issue is that the expand path for the reciprocal estimate square root pattern assumes that pattern cannot fail once it has been decided that this expansion path is available, but because the logic deep inside aarch64_emit_approx_sqrt() differs from use_rsqrt_p() the two disagree as to what is safe. This patch refactors the logic to ensure that we cannot unknowingly make different choices here. PR target/80530 * config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Ensure that the logic for permitting reciprocal estimates matches that in use_rsqrt_p. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-7-branch@247341 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/aarch64/aarch64.c51
2 files changed, 36 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bfefa0a134f..44083590eaa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-04-27 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/80530
+ * config/aarch64/aarch64.c (aarch64_emit_approx_sqrt): Ensure
+ that the logic for permitting reciprocal estimates matches that
+ in use_rsqrt_p.
+
2017-04-27 Jakub Jelinek <jakub@redhat.com>
PR c++/80534
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 5ba08170124..b760905ce3b 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -7925,33 +7925,40 @@ aarch64_emit_approx_sqrt (rtx dst, rtx src, bool recp)
machine_mode mode = GET_MODE (dst);
if (GET_MODE_INNER (mode) == HFmode)
- return false;
+ {
+ gcc_assert (!recp);
+ return false;
+ }
- machine_mode mmsk = mode_for_vector
- (int_mode_for_mode (GET_MODE_INNER (mode)),
- GET_MODE_NUNITS (mode));
- bool use_approx_sqrt_p = (!recp
- && (flag_mlow_precision_sqrt
- || (aarch64_tune_params.approx_modes->sqrt
- & AARCH64_APPROX_MODE (mode))));
- bool use_approx_rsqrt_p = (recp
- && (flag_mrecip_low_precision_sqrt
- || (aarch64_tune_params.approx_modes->recip_sqrt
- & AARCH64_APPROX_MODE (mode))));
+ machine_mode mmsk
+ = mode_for_vector (int_mode_for_mode (GET_MODE_INNER (mode)),
+ GET_MODE_NUNITS (mode));
+ if (!recp)
+ {
+ if (!(flag_mlow_precision_sqrt
+ || (aarch64_tune_params.approx_modes->sqrt
+ & AARCH64_APPROX_MODE (mode))))
+ return false;
+
+ if (flag_finite_math_only
+ || flag_trapping_math
+ || !flag_unsafe_math_optimizations
+ || optimize_function_for_size_p (cfun))
+ return false;
+ }
+ else
+ /* Caller assumes we cannot fail. */
+ gcc_assert (use_rsqrt_p (mode));
- if (!flag_finite_math_only
- || flag_trapping_math
- || !flag_unsafe_math_optimizations
- || !(use_approx_sqrt_p || use_approx_rsqrt_p)
- || optimize_function_for_size_p (cfun))
- return false;
rtx xmsk = gen_reg_rtx (mmsk);
if (!recp)
- /* When calculating the approximate square root, compare the argument with
- 0.0 and create a mask. */
- emit_insn (gen_rtx_SET (xmsk, gen_rtx_NEG (mmsk, gen_rtx_EQ (mmsk, src,
- CONST0_RTX (mode)))));
+ /* When calculating the approximate square root, compare the
+ argument with 0.0 and create a mask. */
+ emit_insn (gen_rtx_SET (xmsk,
+ gen_rtx_NEG (mmsk,
+ gen_rtx_EQ (mmsk, src,
+ CONST0_RTX (mode)))));
/* Estimate the approximate reciprocal square root. */
rtx xdst = gen_reg_rtx (mode);