re PR tree-optimization/86017 (multiple consecutive calls to bzero/memset not merged)
authorRichard Biener <rguenther@suse.de>
Fri, 1 Jun 2018 10:49:54 +0000 (10:49 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 1 Jun 2018 10:49:54 +0000 (10:49 +0000)
2018-06-01  Richard Biener  <rguenther@suse.de>

PR middle-end/86017
* gimple-fold.c (var_decl_component_p): Also allow offsetted
vars wrapped in MEM_REFs.

* gcc.dg/tree-ssa/pr86017.c: New testcase.

From-SVN: r261061

gcc/ChangeLog
gcc/gimple-fold.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr86017.c [new file with mode: 0644]

index 9035e67cd998a89dcf4bc6de8f704d1d77ff0906..8806024a5ae3b80114324a151dd28c5ccca00fce 100644 (file)
@@ -1,3 +1,9 @@
+2018-06-01  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/86017
+       * gimple-fold.c (var_decl_component_p): Also allow offsetted
+       vars wrapped in MEM_REFs.
+
 2018-06-01  Richard Sandiford  <richard.sandiford@linaro.org>
 
        * config/aarch64/aarch64.c (aarch64_ira_change_pseudo_allocno_class):
index 9bbe7f1d9092c268562059748e81442958ac9c1f..f6d758a6828cc22467be72d852092dd68566c746 100644 (file)
@@ -632,7 +632,9 @@ var_decl_component_p (tree var)
   tree inner = var;
   while (handled_component_p (inner))
     inner = TREE_OPERAND (inner, 0);
-  return SSA_VAR_P (inner);
+  return (DECL_P (inner)
+         || (TREE_CODE (inner) == MEM_REF
+             && TREE_CODE (TREE_OPERAND (inner, 0)) == ADDR_EXPR));
 }
 
 /* If the SIZE argument representing the size of an object is in a range
index cec80a5d238744fb72cc184095151614ec7db422..12ed15f42d9d55c985d06882cee17d2687ab04dd 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-01  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/86017
+       * gcc.dg/tree-ssa/pr86017.c: New testcase.
+
 2018-06-01  Richard Biener  <rguenther@suse.de>
 
        PR ipa/85960
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr86017.c b/gcc/testsuite/gcc.dg/tree-ssa/pr86017.c
new file mode 100644 (file)
index 0000000..f216e83
--- /dev/null
@@ -0,0 +1,29 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-store-merging" } */
+
+void f (void*);
+
+void g (void)
+{
+  char a[8];
+  __builtin_memset (a, 0, 8);
+
+  f (a);
+}
+
+void h (void)
+{
+  char a[8];
+  __builtin_memset (a, 0, 1);
+  __builtin_memset (a + 1, 0, 1);
+  __builtin_memset (a + 2, 0, 1);
+  __builtin_memset (a + 3, 0, 1);
+  __builtin_memset (a + 4, 0, 1);
+  __builtin_memset (a + 5, 0, 1);
+  __builtin_memset (a + 6, 0, 1);
+  __builtin_memset (a + 7, 0, 1);
+
+  f (a);
+}
+
+/* { dg-final { scan-tree-dump "Merged into 1 stores" "store-merging" } } */