tree-ssa-sccvn.c (vn_reference_lookup_3): Properly guard empty CTOR and memset partia...
authorRichard Biener <rguenther@suse.de>
Wed, 4 Dec 2019 13:21:39 +0000 (13:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 4 Dec 2019 13:21:39 +0000 (13:21 +0000)
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.

From-SVN: r278965

gcc/ChangeLog
gcc/tree-ssa-sccvn.c

index d80a8a8..29359ee 100644 (file)
@@ -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
index b90ce37..4c70e2a 100644 (file)
@@ -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