aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2021-11-04 09:17:18 +0100
committerRichard Biener <rguenther@suse.de>2021-11-04 13:33:19 +0100
commitd13603501680fcdbb933cb086cd01fcc39be1908 (patch)
tree8fe323a2669e7e309b0cac142890bc18170704fd /gcc
parentd43fc1df7344e9cb705d3ca40217ff4e39aab5bf (diff)
downloadgcc-d13603501680fcdbb933cb086cd01fcc39be1908.zip
gcc-d13603501680fcdbb933cb086cd01fcc39be1908.tar.gz
gcc-d13603501680fcdbb933cb086cd01fcc39be1908.tar.bz2
rtl-optimization/103075 - avoid ICEing on unfolded int-to-float converts
The following avoids asserting in exact_int_to_float_conversion_p that the argument is not constant which it in fact can be with -frounding-math and inexact int-to-float conversions. Say so. 2021-11-04 Richard Biener <rguenther@suse.de> PR rtl-optimization/103075 * simplify-rtx.c (exact_int_to_float_conversion_p): Return false for a VOIDmode operand. * gcc.dg/pr103075.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/simplify-rtx.c8
-rw-r--r--gcc/testsuite/gcc.dg/pr103075.c8
2 files changed, 13 insertions, 3 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index 9038aff..eea7476 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -899,10 +899,12 @@ simplify_context::simplify_unary_operation (rtx_code code, machine_mode mode,
static bool
exact_int_to_float_conversion_p (const_rtx op)
{
- int out_bits = significand_size (GET_MODE_INNER (GET_MODE (op)));
machine_mode op0_mode = GET_MODE (XEXP (op, 0));
- /* Constants shouldn't reach here. */
- gcc_assert (op0_mode != VOIDmode);
+ /* Constants can reach here with -frounding-math, if they do then
+ the conversion isn't exact. */
+ if (op0_mode == VOIDmode)
+ return false;
+ int out_bits = significand_size (GET_MODE_INNER (GET_MODE (op)));
int in_prec = GET_MODE_UNIT_PRECISION (op0_mode);
int in_bits = in_prec;
if (HWI_COMPUTABLE_MODE_P (op0_mode))
diff --git a/gcc/testsuite/gcc.dg/pr103075.c b/gcc/testsuite/gcc.dg/pr103075.c
new file mode 100644
index 0000000..b332fb0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr103075.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-O -frounding-math" } */
+
+float
+foo (void)
+{
+ return (float) 0x1699925 * 1.1;
+}