]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/120817 - bogus DSE of .MASK_STORE
authorRichard Biener <rguenther@suse.de>
Mon, 7 Jul 2025 07:56:50 +0000 (09:56 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 7 Jul 2025 13:22:39 +0000 (15:22 +0200)
DSE used ao_ref_init_from_ptr_and_size for .MASK_STORE but
alias-analysis will use the specified size to disambiguate
against smaller objects.  For .MASK_STORE we instead have to
make the access size unspecified but we can still constrain
the access extent based on the maximum size possible.

PR tree-optimization/120817
* tree-ssa-dse.cc (initialize_ao_ref_for_dse): Use
ao_ref_init_from_ptr_and_range with unknown size for
.MASK_STORE and .MASK_LEN_STORE.

* gcc.dg/vect/pr120817.c: New testcase.

gcc/testsuite/gcc.dg/vect/pr120817.c [new file with mode: 0644]
gcc/tree-ssa-dse.cc

diff --git a/gcc/testsuite/gcc.dg/vect/pr120817.c b/gcc/testsuite/gcc.dg/vect/pr120817.c
new file mode 100644 (file)
index 0000000..d8f55c9
--- /dev/null
@@ -0,0 +1,40 @@
+/* { dg-additional-options "-O1" } */
+/* { dg-additional-options "-mcpu=neoverse-n2" { target aarch64*-*-* } } */
+
+#include "tree-vect.h"
+
+typedef struct {
+    int _M_current;
+} __normal_iterator;
+
+typedef struct {
+    char _M_elems[5];
+} array_5;
+
+__normal_iterator __trans_tmp_1 = {-5};
+
+__attribute__((noipa))
+array_5 copySourceIntoTarget() {
+    array_5 target;
+    char* target_it = target._M_elems;
+
+    while (__trans_tmp_1._M_current != 0) {
+        *target_it = 1;
+        __trans_tmp_1._M_current++;
+        target_it++;
+    }
+
+    return target;
+}
+
+int main ()
+{
+  check_vect ();
+
+  array_5 res = copySourceIntoTarget();
+
+#pragma GCC novector
+  for (int i = 0; i < 5; i++)
+    if (res._M_elems[i] != 1)
+      __builtin_abort ();
+}
index 5ac4280ee361218ee3da06439d295866784cc528..51a572316cdcd84c000a1ae87d897fbfac1b4f0c 100644 (file)
@@ -181,10 +181,10 @@ initialize_ao_ref_for_dse (gimple *stmt, ao_ref *write, bool may_def_ok = false)
               can provide a may-def variant.  */
            if (may_def_ok)
              {
-               ao_ref_init_from_ptr_and_size (
-                 write, gimple_call_arg (stmt, 0),
-                 TYPE_SIZE_UNIT (
-                   TREE_TYPE (gimple_call_arg (stmt, stored_value_index))));
+               ao_ref_init_from_ptr_and_range (
+                 write, gimple_call_arg (stmt, 0), true, 0, -1,
+                 tree_to_poly_int64 (TYPE_SIZE (
+                   TREE_TYPE (gimple_call_arg (stmt, stored_value_index)))));
                return true;
              }
            break;