aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2018-02-16 12:01:23 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2018-02-16 12:01:23 +0000
commit5c8cebe7d6acb478309d6e03fd4df7e05d1b0f1e (patch)
tree1cdeff7b2f6541e3ca45316fdd9e7ab725a954ea /gcc/tree-ssa.c
parent95df04335bea92a715501271ad7d854e854706b3 (diff)
downloadgcc-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.c11
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;
}