[gcc/devel/ranger] [GCC][BUG][ARM] Fix ICE due to BFmode libfunc call (PR93300)
Aldy Hernandez
aldyh@gcc.gnu.org
Wed Jun 17 18:39:20 GMT 2020
https://gcc.gnu.org/g:ff861d65950ede95b6c28ac720c56d44cff784de
commit ff861d65950ede95b6c28ac720c56d44cff784de
Author: Stam Markianos-Wright <stam.markianos-wright@arm.com>
Date: Wed Feb 5 19:21:42 2020 +0000
[GCC][BUG][ARM] Fix ICE due to BFmode libfunc call (PR93300)
This was sent and approved on gcc-patches as "[GCC][BUG][Aarch64][ARM]
(PR93300) Fix ICE due to BFmode placement in GET_MODES_WIDER chain".
The observed error came about because BFmode was placed between HFmode
and SFmode in the GET_MODES_WIDER chain, resulting in convert_mode_scalar
attempting to gen a libfunc for a HFmode -> BFmode conversion.
This patch registers NULL for all libfuncs in BFmode, which stops the
middle-end from attempting to generate them.
gcc/ChangeLog:
2020-02-06 Stam Markianos-Wright <stam.markianos-wright@arm.com>
PR target/93300
* config/arm/arm.c (arm_block_arith_comp_libfuncs_for_mode): New.
(arm_init_libfuncs): Add BFmode support to block spurious BF libfuncs.
Use arm_block_arith_comp_libfuncs_for_mode for HFmode.
Diff:
---
gcc/ChangeLog | 7 +++++++
gcc/config/arm/arm.c | 51 ++++++++++++++++++++++++++++++++++++---------------
2 files changed, 43 insertions(+), 15 deletions(-)
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 382e31368dc..82079c76325 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2020-02-06 Stam Markianos-Wright <stam.markianos-wright@arm.com>
+
+ PR target/93300
+ * config/arm/arm.c (arm_block_arith_comp_libfuncs_for_mode): New.
+ (arm_init_libfuncs): Add BFmode support to block spurious BF libfuncs.
+ Use arm_block_arith_comp_libfuncs_for_mode for HFmode.
+
2020-02-06 Jakub Jelinek <jakub@redhat.com>
PR target/93594
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index fe3bc675b42..9cc7bc0e562 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -2491,10 +2491,35 @@ arm_set_fixed_conv_libfunc (convert_optab optable, machine_mode to,
static GTY(()) rtx speculation_barrier_libfunc;
+/* Record that we have no arithmetic or comparison libfuncs for
+ machine mode MODE. */
+
+static void
+arm_block_arith_comp_libfuncs_for_mode (machine_mode mode)
+{
+ /* Arithmetic. */
+ set_optab_libfunc (add_optab, mode, NULL);
+ set_optab_libfunc (sdiv_optab, mode, NULL);
+ set_optab_libfunc (smul_optab, mode, NULL);
+ set_optab_libfunc (neg_optab, mode, NULL);
+ set_optab_libfunc (sub_optab, mode, NULL);
+
+ /* Comparisons. */
+ set_optab_libfunc (eq_optab, mode, NULL);
+ set_optab_libfunc (ne_optab, mode, NULL);
+ set_optab_libfunc (lt_optab, mode, NULL);
+ set_optab_libfunc (le_optab, mode, NULL);
+ set_optab_libfunc (ge_optab, mode, NULL);
+ set_optab_libfunc (gt_optab, mode, NULL);
+ set_optab_libfunc (unord_optab, mode, NULL);
+}
+
/* Set up library functions unique to ARM. */
static void
arm_init_libfuncs (void)
{
+ machine_mode mode_iter;
+
/* For Linux, we have access to kernel support for atomic operations. */
if (arm_abi == ARM_ABI_AAPCS_LINUX)
init_sync_libfuncs (MAX_SYNC_LIBFUNC_SIZE);
@@ -2623,27 +2648,23 @@ arm_init_libfuncs (void)
? "__gnu_d2h_ieee"
: "__gnu_d2h_alternative"));
- /* Arithmetic. */
- set_optab_libfunc (add_optab, HFmode, NULL);
- set_optab_libfunc (sdiv_optab, HFmode, NULL);
- set_optab_libfunc (smul_optab, HFmode, NULL);
- set_optab_libfunc (neg_optab, HFmode, NULL);
- set_optab_libfunc (sub_optab, HFmode, NULL);
-
- /* Comparisons. */
- set_optab_libfunc (eq_optab, HFmode, NULL);
- set_optab_libfunc (ne_optab, HFmode, NULL);
- set_optab_libfunc (lt_optab, HFmode, NULL);
- set_optab_libfunc (le_optab, HFmode, NULL);
- set_optab_libfunc (ge_optab, HFmode, NULL);
- set_optab_libfunc (gt_optab, HFmode, NULL);
- set_optab_libfunc (unord_optab, HFmode, NULL);
+ arm_block_arith_comp_libfuncs_for_mode (HFmode);
break;
default:
break;
}
+ /* For all possible libcalls in BFmode, record NULL. */
+ FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
+ {
+ set_conv_libfunc (trunc_optab, BFmode, mode_iter, NULL);
+ set_conv_libfunc (trunc_optab, mode_iter, BFmode, NULL);
+ set_conv_libfunc (sext_optab, mode_iter, BFmode, NULL);
+ set_conv_libfunc (sext_optab, BFmode, mode_iter, NULL);
+ }
+ arm_block_arith_comp_libfuncs_for_mode (BFmode);
+
/* Use names prefixed with __gnu_ for fixed-point helper functions. */
{
const arm_fixed_mode_set fixed_arith_modes[] =
More information about the Gcc-cvs
mailing list