Hi,

  The below patch adds a new effective target keyword (store_merge) for
  use in the store_merging_xxx.c tests.

  The tests currently require non_strict_align, but they still fail for the avr.
  Eyeballing the dump, I found that the pass doesn't attempt merging as it is
  unprofitable for a target like the avr which has only single byte
  stores.

  I figured store merging is unlikely to be profitable for targets with
  smallish word sizes, and added a check_effective_target_store_merge
  that combines non_strict_align and int32plus.

  Is this ok for trunk?

Regards
Senthil

gcc/testsuite/ChangeLog

2016-11-03  Senthil Kumar Selvaraj  <senthil_kumar.selva...@atmel.com>

        * gcc.dg/store_merging_1.c: Require store_merge.
        * gcc.dg/store_merging_2.c: Likewise.
        * gcc.dg/store_merging_4.c: Likewise.
        * gcc.dg/store_merging_5.c: Likewise. 
        * gcc.dg/store_merging_6.c: Likewise.
        * gcc.dg/store_merging_7.c: Likewise.
        * gcc.dg/store_merging_8.c: Likewise.
        * lib/target-supports.exp (check_effective_target_store_merge): New.


Index: gcc/testsuite/gcc.dg/store_merging_1.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_1.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_1.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 struct bar {
Index: gcc/testsuite/gcc.dg/store_merging_2.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_2.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_2.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 struct bar
Index: gcc/testsuite/gcc.dg/store_merging_4.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_4.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_4.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 /* Check that we can merge interleaving stores that are guaranteed
Index: gcc/testsuite/gcc.dg/store_merging_5.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_5.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_5.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 /* Make sure that non-aliasing non-constant interspersed stores do not
Index: gcc/testsuite/gcc.dg/store_merging_6.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_6.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_6.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do run } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 /* Check that we can widen accesses to bitfields.  */
Index: gcc/testsuite/gcc.dg/store_merging_7.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_7.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_7.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 /* Check that we can merge consecutive array members through the pointer.
Index: gcc/testsuite/gcc.dg/store_merging_8.c
===================================================================
--- gcc/testsuite/gcc.dg/store_merging_8.c      (revision 241808)
+++ gcc/testsuite/gcc.dg/store_merging_8.c      (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-require-effective-target non_strict_align } */
+/* { dg-require-effective-target store_merge } */
 /* { dg-options "-O2 -fdump-tree-store-merging" } */
 
 struct baz {
Index: gcc/testsuite/lib/target-supports.exp
===================================================================
--- gcc/testsuite/lib/target-supports.exp       (revision 241808)
+++ gcc/testsuite/lib/target-supports.exp       (working copy)
@@ -8107,3 +8107,16 @@
 
     return [check_effective_target_divmod]
 }
+
+# Return 1 if store merging optimization is applicable for target.
+# Store merging is not profitable for targets like the avr which
+# can load/store only one byte at a time. Use int size as a proxy
+# for the number of bytes the target can write, and skip for targets
+# with a smallish (< 32) size.
+
+proc check_effective_target_store_merge { } {
+    if { [is-effective-target non_strict_align ] && [is-effective-target 
int32plus] } {
+       return 1
+    }
+    return 0
+}

Reply via email to