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  <ja...@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.

--- 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;

        Jakub

Reply via email to