From 6d8d58a852b54b9e3002b62ea0e658a9a4bfbb93 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 4 Dec 2019 13:21:39 +0000 Subject: [PATCH] tree-ssa-sccvn.c (vn_reference_lookup_3): Properly guard empty CTOR and memset partial-def registering. 2019-12-04 Richard Biener * 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. From-SVN: r278965 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa-sccvn.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d80a8a8058a..29359ee3f5b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-12-04 Richard Biener + + * 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 * fold-const.c (native_encode_vector_part): Handle diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index b90ce37286d..4c70e2ac05d 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 -- 2.30.2