diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-12-16 22:35:35 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-12-16 22:35:35 +0000 |
commit | 9c8cbc740a2c2314a28b739ad87a44b0341e18e3 (patch) | |
tree | 786c4b9620c7cca6c269b60d2dba7e8c6dc27c44 /gcc/tree-ssa-sccvn.c | |
parent | 07981468ebdf268622d1fa47ce529958aefd154b (diff) | |
download | gcc-9c8cbc740a2c2314a28b739ad87a44b0341e18e3.zip gcc-9c8cbc740a2c2314a28b739ad87a44b0341e18e3.tar.gz gcc-9c8cbc740a2c2314a28b739ad87a44b0341e18e3.tar.bz2 |
tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to get_ref_base_and_extent returns -1 as the max size.
* tree-ssa-sccvn.c (vn_reference_lookup_3): Always punt if the call to
get_ref_base_and_extent returns -1 as the max size.
From-SVN: r167958
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 6efb245..970f2c0 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1339,6 +1339,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) size2 = TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) * 8; if ((unsigned HOST_WIDE_INT)size2 / 8 == TREE_INT_CST_LOW (gimple_call_arg (def_stmt, 2)) + && maxsize2 != -1 && operand_equal_p (base, base2, 0) && offset2 <= offset && offset2 + size2 >= offset + maxsize) @@ -1362,7 +1363,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) HOST_WIDE_INT offset2, size2, maxsize2; base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), &offset2, &size2, &maxsize2); - if (operand_equal_p (base, base2, 0) + if (maxsize2 != -1 + && operand_equal_p (base, base2, 0) && offset2 <= offset && offset2 + size2 >= offset + maxsize) { @@ -1383,7 +1385,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) || handled_component_p (gimple_assign_rhs1 (def_stmt)))) { tree base2; - HOST_WIDE_INT offset2, size2; + HOST_WIDE_INT offset2, size2, maxsize2; int i, j; VEC (vn_reference_op_s, heap) *rhs = NULL; vn_reference_op_t vro; @@ -1396,8 +1398,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_) base2 = ao_ref_base (&lhs_ref); offset2 = lhs_ref.offset; size2 = lhs_ref.size; - if ((base != base2 - && !operand_equal_p (base, base2, 0)) + maxsize2 = lhs_ref.max_size; + if (maxsize2 == -1 + || (base != base2 && !operand_equal_p (base, base2, 0)) || offset2 > offset || offset2 + size2 < offset + maxsize) return (void *)-1; |