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