simplify-rtx: Punt for modes with precision above MAX_BITSIZE_MODE_ANY_INT [PR93376]
diff mbox series

Message ID 20200123190630.GD10088@tucnak
State New
Headers show
Series
  • simplify-rtx: Punt for modes with precision above MAX_BITSIZE_MODE_ANY_INT [PR93376]
Related show

Commit Message

Jakub Jelinek Jan. 23, 2020, 7:06 p.m. UTC
Hi!

The following patch makes sure we punt in the 3 spots if precision is above
MAX_BITSIZE_MODE_ANY_INT.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2020-01-23  Jakub Jelinek  <jakub@redhat.com>

	PR target/93376
	* simplify-rtx.c (simplify_const_unary_operation,
	simplify_const_binary_operation): Punt for mode precision above
	MAX_BITSIZE_MODE_ANY_INT.


	Jakub

Comments

Richard Sandiford Jan. 24, 2020, 9:36 a.m. UTC | #1
Jakub Jelinek <jakub@redhat.com> writes:
> Hi!
>
> The following patch makes sure we punt in the 3 spots if precision is above
> MAX_BITSIZE_MODE_ANY_INT.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2020-01-23  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR target/93376
> 	* simplify-rtx.c (simplify_const_unary_operation,
> 	simplify_const_binary_operation): Punt for mode precision above
> 	MAX_BITSIZE_MODE_ANY_INT.

OK, thanks.

Richard

Patch
diff mbox series

--- gcc/simplify-rtx.c.jj	2020-01-12 11:54:36.933405563 +0100
+++ gcc/simplify-rtx.c	2020-01-23 11:52:17.292459465 +0100
@@ -1824,6 +1824,9 @@  simplify_const_unary_operation (enum rtx
   if (CONST_SCALAR_INT_P (op) && is_a <scalar_int_mode> (mode, &result_mode))
     {
       unsigned int width = GET_MODE_PRECISION (result_mode);
+      if (width > MAX_BITSIZE_MODE_ANY_INT)
+	return 0;
+
       wide_int result;
       scalar_int_mode imode = (op_mode == VOIDmode
 			       ? result_mode
@@ -1968,6 +1971,9 @@  simplify_const_unary_operation (enum rtx
 	   && is_int_mode (mode, &result_mode))
     {
       unsigned int width = GET_MODE_PRECISION (result_mode);
+      if (width > MAX_BITSIZE_MODE_ANY_INT)
+	return 0;
+
       /* Although the overflow semantics of RTL's FIX and UNSIGNED_FIX
 	 operators are intentionally left unspecified (to ease implementation
 	 by target backends), for consistency, this routine implements the
@@ -4422,7 +4428,8 @@  simplify_const_binary_operation (enum rt
   scalar_int_mode int_mode;
   if (is_a <scalar_int_mode> (mode, &int_mode)
       && CONST_SCALAR_INT_P (op0)
-      && CONST_SCALAR_INT_P (op1))
+      && CONST_SCALAR_INT_P (op1)
+      && GET_MODE_PRECISION (int_mode) <= MAX_BITSIZE_MODE_ANY_INT)
     {
       wide_int result;
       wi::overflow_type overflow;