aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-04 18:05:10 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-04 18:05:10 +0000
commit1de1073520a877b46a0b93c5b0eb4c0b29b97e84 (patch)
tree00a25a55d43f38ef6035f5a5034d458d1e0973de /gcc/fold-const.c
parent88654ce63de73fc51a47e7d54070c2c0b6b2f34b (diff)
downloadgcc-1de1073520a877b46a0b93c5b0eb4c0b29b97e84.zip
gcc-1de1073520a877b46a0b93c5b0eb4c0b29b97e84.tar.gz
gcc-1de1073520a877b46a0b93c5b0eb4c0b29b97e84.tar.bz2
Add tree_fits_uhwi_p tests to BIT_FIELD_REF folder
The first BIT_FIELD_REF folding pattern assumed without checking that operands satisfy tree_fits_uhwi_p. The second pattern does check this: /* On constants we can use native encode/interpret to constant fold (nearly) all BIT_FIELD_REFs. */ if (CONSTANT_CLASS_P (arg0) && can_native_interpret_type_p (type) && BITS_PER_UNIT == 8 && tree_fits_uhwi_p (op1) && tree_fits_uhwi_p (op2)) so this patch adds the checks to the first pattern too. This is needed for POLY_INT_CST bit positions. 2018-01-04 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * fold-const.c (fold_ternary_loc): Check tree_fits_uhwi_p before using tree_to_uhwi. From-SVN: r256258
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 46490ca..521c2dc 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -11643,7 +11643,9 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
if (TREE_CODE (arg0) == VECTOR_CST
&& (type == TREE_TYPE (TREE_TYPE (arg0))
|| (TREE_CODE (type) == VECTOR_TYPE
- && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0)))))
+ && TREE_TYPE (type) == TREE_TYPE (TREE_TYPE (arg0))))
+ && tree_fits_uhwi_p (op1)
+ && tree_fits_uhwi_p (op2))
{
tree eltype = TREE_TYPE (TREE_TYPE (arg0));
unsigned HOST_WIDE_INT width = tree_to_uhwi (TYPE_SIZE (eltype));