diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-01-24 22:47:23 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-01-24 22:47:23 +0100 |
commit | 14e5881e37771f1f58123e77c558adb3b90c8764 (patch) | |
tree | 6e799dae9aee8bc5a0a25cfff0a51afa6a9011ca /gcc/simplify-rtx.c | |
parent | 6ccc19bd4d12379a0d9fce486ceba3207749424a (diff) | |
download | gcc-14e5881e37771f1f58123e77c558adb3b90c8764.zip gcc-14e5881e37771f1f58123e77c558adb3b90c8764.tar.gz gcc-14e5881e37771f1f58123e77c558adb3b90c8764.tar.bz2 |
simplify-rtx: Punt for modes with precision above MAX_BITSIZE_MODE_ANY_INT [PR93376]
The following patch makes sure we punt in the 3 spots if precision is above
MAX_BITSIZE_MODE_ANY_INT.
2020-01-24 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.
Diffstat (limited to 'gcc/simplify-rtx.c')
-rw-r--r-- | gcc/simplify-rtx.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 897de3f..eff1d07 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -1824,6 +1824,9 @@ simplify_const_unary_operation (enum rtx_code code, machine_mode mode, 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_code code, machine_mode mode, && 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 rtx_code code, machine_mode mode, 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; |