aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-ssa-sccvn.c13
2 files changed, 17 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d80a8a8..29359ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-12-04 Richard Biener <rguenther@suse.de>
+
+ * tree-ssa-sccvn.c (vn_reference_lookup_3): Properly guard
+ empty CTOR and memset partial-def registering. Take advantage
+ of fancy offset analysis in memset handling.
+
2019-12-04 Richard Sandiford <richard.sandiford@arm.com>
* fold-const.c (native_encode_vector_part): Handle
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index b90ce37..4c70e2a 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -2441,6 +2441,12 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
return (void *)-1;
tree len = gimple_call_arg (def_stmt, 2);
HOST_WIDE_INT leni, offset2i, offseti;
+ /* Sometimes the above trickery is smarter than alias analysis. Take
+ advantage of that. */
+ if (!ranges_maybe_overlap_p (offset, maxsize, offset2,
+ (wi::to_poly_offset (len)
+ << LOG2_BITS_PER_UNIT)))
+ return NULL;
if (data->partial_defs.is_empty ()
&& known_subrange_p (offset, maxsize, offset2,
wi::to_poly_offset (len) << LOG2_BITS_PER_UNIT))
@@ -2478,7 +2484,8 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
&& tree_to_poly_int64 (len).is_constant (&leni)
&& offset.is_constant (&offseti)
&& offset2.is_constant (&offset2i)
- && maxsize.is_constant (&maxsizei))
+ && maxsize.is_constant (&maxsizei)
+ && ranges_known_overlap_p (offseti, maxsizei, offset2i, leni))
{
pd_data pd;
pd.rhs = build_constructor (NULL_TREE, NULL);
@@ -2534,7 +2541,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
&& offset2.is_constant (&offset2i)
&& offset2i % BITS_PER_UNIT == 0
&& size2.is_constant (&size2i)
- && size2i % BITS_PER_UNIT == 0)
+ && size2i % BITS_PER_UNIT == 0
+ && ranges_known_overlap_p (offseti, maxsizei,
+ offset2i, size2i))
{
/* Let clobbers be consumed by the partial-def tracker
which can choose to ignore them if they are shadowed