diff options
author | Richard Biener <rguenther@suse.de> | 2018-02-16 12:01:23 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-02-16 12:01:23 +0000 |
commit | 5c8cebe7d6acb478309d6e03fd4df7e05d1b0f1e (patch) | |
tree | 1cdeff7b2f6541e3ca45316fdd9e7ab725a954ea /gcc/tree-ssa.c | |
parent | 95df04335bea92a715501271ad7d854e854706b3 (diff) | |
download | gcc-5c8cebe7d6acb478309d6e03fd4df7e05d1b0f1e.zip gcc-5c8cebe7d6acb478309d6e03fd4df7e05d1b0f1e.tar.gz gcc-5c8cebe7d6acb478309d6e03fd4df7e05d1b0f1e.tar.bz2 |
re PR tree-optimization/84417 (internal compiler error: verify_gimple failed)
2018-02-16 Richard Biener <rguenther@suse.de>
PR tree-optimization/84417
* tree-ssa.c (non_rewritable_mem_ref_base): Properly constrain
the MEM_REF offset when conversion to BIT_FIELD_REF is desired.
(non_rewritable_lvalue_p): Likewise, use poly-ints.
* gcc.dg/torture/pr84417.c: New testcase.
From-SVN: r257731
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r-- | gcc/tree-ssa.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 949b951..d197f99 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1434,6 +1434,7 @@ non_rewritable_mem_ref_base (tree ref) || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE) && useless_type_conversion_p (TREE_TYPE (base), TREE_TYPE (TREE_TYPE (decl))) + && known_ge (mem_ref_offset (base), 0) && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))), mem_ref_offset (base)) && multiple_of_p (sizetype, TREE_OPERAND (base, 1), @@ -1516,11 +1517,11 @@ non_rewritable_lvalue_p (tree lhs) && TYPE_MODE (TREE_TYPE (decl)) != BLKmode && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)), TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))), 0) - && tree_fits_uhwi_p (TREE_OPERAND (lhs, 1)) - && tree_int_cst_lt (TREE_OPERAND (lhs, 1), - TYPE_SIZE_UNIT (TREE_TYPE (decl))) - && (tree_to_uhwi (TREE_OPERAND (lhs, 1)) - % tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))) == 0) + && known_ge (mem_ref_offset (lhs), 0) + && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))), + mem_ref_offset (lhs)) + && multiple_of_p (sizetype, TREE_OPERAND (lhs, 1), + TYPE_SIZE_UNIT (TREE_TYPE (lhs)))) return false; } |