diff mbox

[ARM] Change default vector size to 128 bits - take 3

Message ID CAKSNEw6tDGHTJ2_D=uVm3an5Gf7OBfAhWsJFQTm7As-1VmRntQ@mail.gmail.com
State New
Headers show

Commit Message

Ira Rosen Aug. 16, 2011, 9:28 a.m. UTC
Hi,

This patch changes the default vector size for auto-vectorization on
ARM NEON to 128 bits. This new version is a result of a discussion
with Richard and Ramana.

wwwdocs changes will follow shortly.

Bootstrapped and tested on arm-linux-gnueabi. The testsuite changes
were also checked on powerpc64-suse-linux and x86_64-suse-linux.

There is one new failure:
gcc.c-torture/execute/mode-dependent-address.c fails with -O3
-funroll-loops with this patch or with -mvectorize-with-neon-quad.
Ramana has a patch to fix this
http://gcc.gnu.org/ml/gcc/2011-08/msg00284.html. I will wait with
committing my patch until this issue is resolved.

OK for mainline?

Thanks,
Ira

ChangeLog:

   * config/arm/arm.c (arm_preferred_simd_mode): Check
   TARGET_NEON_VECTORIZE_DOUBLE instead of
   TARGET_NEON_VECTORIZE_QUAD.
   (arm_expand_sync): Likewise.
   * config/arm/arm.opt (mvectorize-with-neon-quad): Make inverse
   mask of mvectorize-with-neon-double.  Add RejectNegative.
   (mvectorize-with-neon-double): New.

testsuite/ChangeLog:

   * lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
   New procedure.
   (add_options_for_quad_vectors): Replace with ...
   (add_options_for_double_vectors): ... this.
   * gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
    support multiple vector sizes since the vectorizer attempts to
    vectorize with both vector sizes.
   * gcc.dg/vect/no-vfa-vect-79.c,
    gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
    gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
    gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
    gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
    gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
    gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
   * gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
   * gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
   gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
   gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
   gcc.dg/vect/vect-40.c: Likewise.
  * gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
   redundant.
  * gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
   gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
   gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
   gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
   Likewise.
 * gcc.dg/vect/vect-peel-4.c: Make ia global.

 Only generate absolute relocations on word sized values.
Index: testsuite/lib/target-supports.exp
===================================================================
--- testsuite/lib/target-supports.exp	(revision 177426)
+++ testsuite/lib/target-supports.exp	(working copy)
@@ -3362,6 +3362,24 @@ foreach N {2 3 4 8} {
     }]
 }
 
+# Return 1 if the target supports multiple vector sizes
+
+proc check_effective_target_vect_multiple_sizes { } {
+    global et_vect_multiple_sizes
+
+    if [info exists et_vect_multiple_sizes_saved] {
+        verbose "check_effective_target_vect_multiple_sizes: using cached result" 2
+    } else {
+        set et_vect_multiple_sizes_saved 0
+        if { ([istarget arm*-*-*] && [check_effective_target_arm_neon]) } {
+           set et_vect_multiple_sizes_saved 1
+        }
+    }
+
+    verbose "check_effective_target_vect_multiple_sizes: returning $et_vect_multiple_sizes_saved" 2
+    return $et_vect_multiple_sizes_saved
+}
+
 # Return 1 if the target supports section-anchors
 
 proc check_effective_target_section_anchors { } {
@@ -3745,11 +3763,11 @@ proc add_options_for_bind_pic_locally { flags } {
     return $flags
 }
 
-# Add to FLAGS the flags needed to enable 128-bit vectors.
+# Add to FLAGS the flags needed to enable 64-bit vectors.
 
-proc add_options_for_quad_vectors { flags } {
+proc add_options_for_double_vectors { flags } {
     if [is-effective-target arm_neon_ok] {
-	return "$flags -mvectorize-with-neon-quad"
+	return "$flags -mvectorize-with-neon-double"
     }
 
     return $flags
Index: testsuite/gfortran.dg/vect/pr19049.f90
===================================================================
--- testsuite/gfortran.dg/vect/pr19049.f90	(revision 177426)
+++ testsuite/gfortran.dg/vect/pr19049.f90	(working copy)
@@ -19,6 +19,7 @@ subroutine s111 (ntimes,ld,n,ctime,dtime,a,b,c,d,e
       end
 
 ! { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } }
-! { dg-final { scan-tree-dump-times "complicated access pattern" 1 "vect" } }
+! { dg-final { scan-tree-dump-times "complicated access pattern" 1 "vect" { xfail vect_multiple_sizes } } }
+! { dg-final { scan-tree-dump-times "complicated access pattern" 2 "vect" { target vect_multiple_sizes } } }
 ! { dg-final { cleanup-tree-dump "vect" } }
 
Index: testsuite/gcc.dg/vect/vect-42.c
===================================================================
--- testsuite/gcc.dg/vect/vect-42.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-42.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/no-vfa-vect-79.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-79.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-vect-79.c	(working copy)
@@ -46,5 +46,6 @@ int main (void)
   If/when the aliasing problems are resolved, unalignment may
   prevent vectorization on some targets.  */
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect"  { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence between" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-102a.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-102a.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-vect-102a.c	(working copy)
@@ -53,6 +53,7 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
Index: testsuite/gcc.dg/vect/vect-outer-5.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-5.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-5.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_float } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include <signal.h>
Index: testsuite/gcc.dg/vect/vect-multitypes-6.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-6.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-multitypes-6.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-52.c
===================================================================
--- testsuite/gcc.dg/vect/vect-52.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-52.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-109.c
===================================================================
--- testsuite/gcc.dg/vect/vect-109.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-109.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-54.c
===================================================================
--- testsuite/gcc.dg/vect/vect-54.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-54.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-46.c
===================================================================
--- testsuite/gcc.dg/vect/vect-46.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-46.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-peel-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-peel-1.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-peel-1.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-1a.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1a.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-1a.c	(working copy)
@@ -20,5 +20,6 @@ foo (){
 }
 
 /* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-peel-2.c
===================================================================
--- testsuite/gcc.dg/vect/vect-peel-2.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-peel-2.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-48.c
===================================================================
--- testsuite/gcc.dg/vect/vect-48.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-48.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-1b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1b.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-1b.c	(working copy)
@@ -22,5 +22,6 @@ foo (){
 }
 
 /* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-peel-4.c
===================================================================
--- testsuite/gcc.dg/vect/vect-peel-4.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-peel-4.c	(working copy)
@@ -6,12 +6,12 @@
 #define N 128
 
 int ib[N+7];
+int ia[N+1];
 
 __attribute__ ((noinline))
 int main1 ()
 {
   int i;
-  int ia[N+1];
 
   /* Don't peel keeping one load and the store aligned.  */
   for (i = 0; i <= N; i++)
Index: testsuite/gcc.dg/vect/vect-outer-2b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-2b.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-2b.c	(working copy)
@@ -37,5 +37,6 @@ int main (void)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "strided access in outer loop." 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-outer-3a.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-3a.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-3a.c	(working copy)
@@ -49,5 +49,6 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */
-/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 3 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-37.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-37.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-vect-37.c	(working copy)
@@ -58,5 +58,6 @@ int main (void)
    If/when the aliasing problems are resolved, unalignment may
    prevent vectorization on some targets.  */
 /* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence between" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 4 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/slp-25.c
===================================================================
--- testsuite/gcc.dg/vect/slp-25.c	(revision 177426)
+++ testsuite/gcc.dg/vect/slp-25.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-3b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-3b.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-3b.c	(working copy)
@@ -49,5 +49,6 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 4 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-101.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-101.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-vect-101.c	(working copy)
@@ -45,6 +45,7 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
Index: testsuite/gcc.dg/vect/no-vfa-vect-102.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-102.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-vect-102.c	(working copy)
@@ -53,6 +53,7 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
Index: testsuite/gcc.dg/vect/vect-96.c
===================================================================
--- testsuite/gcc.dg/vect/vect-96.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-96.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-multitypes-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-1.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-multitypes-1.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c	(working copy)
@@ -58,7 +58,8 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vect_recog_dot_prod_pattern: detected" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 2 "vect" { target vect_multiple_sizes } } } */
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
 
Index: testsuite/gcc.dg/vect/vect-outer-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-outer-1.c	(working copy)
@@ -22,5 +22,6 @@ foo (){
 }
 
 /* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/slp-3.c
===================================================================
--- testsuite/gcc.dg/vect/slp-3.c	(revision 177426)
+++ testsuite/gcc.dg/vect/slp-3.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/no-vfa-pr29145.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-pr29145.c	(revision 177426)
+++ testsuite/gcc.dg/vect/no-vfa-pr29145.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-multitypes-3.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-3.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-multitypes-3.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-40.c
===================================================================
--- testsuite/gcc.dg/vect/vect-40.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-40.c	(working copy)
@@ -1,4 +1,5 @@
 /* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-104.c
===================================================================
--- testsuite/gcc.dg/vect/vect-104.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-104.c	(working copy)
@@ -64,6 +64,7 @@ int main (void)
 }
 
 /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
 /* { dg-final { cleanup-tree-dump "vect" } } */
 
Index: testsuite/gcc.dg/vect/vect-multitypes-4.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-4.c	(revision 177426)
+++ testsuite/gcc.dg/vect/vect-multitypes-4.c	(working copy)
@@ -1,5 +1,4 @@
 /* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
 
 #include <stdarg.h>
 #include "tree-vect.h"

Comments

Richard Earnshaw Aug. 17, 2011, 12:49 p.m. UTC | #1
On 16/08/11 10:28, Ira Rosen wrote:
> Hi,
> 
> This patch changes the default vector size for auto-vectorization on
> ARM NEON to 128 bits. This new version is a result of a discussion
> with Richard and Ramana.
> 
> wwwdocs changes will follow shortly.
> 
> Bootstrapped and tested on arm-linux-gnueabi. The testsuite changes
> were also checked on powerpc64-suse-linux and x86_64-suse-linux.
> 
> There is one new failure:
> gcc.c-torture/execute/mode-dependent-address.c fails with -O3
> -funroll-loops with this patch or with -mvectorize-with-neon-quad.
> Ramana has a patch to fix this
> http://gcc.gnu.org/ml/gcc/2011-08/msg00284.html. I will wait with
> committing my patch until this issue is resolved.
> 
> OK for mainline?
> 
> Thanks,
> Ira
> 
> ChangeLog:
> 
>    * config/arm/arm.c (arm_preferred_simd_mode): Check
>    TARGET_NEON_VECTORIZE_DOUBLE instead of
>    TARGET_NEON_VECTORIZE_QUAD.
>    (arm_expand_sync): Likewise.
>    * config/arm/arm.opt (mvectorize-with-neon-quad): Make inverse
>    mask of mvectorize-with-neon-double.  Add RejectNegative.
>    (mvectorize-with-neon-double): New.
> 
> testsuite/ChangeLog:
> 
>    * lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
>    New procedure.
>    (add_options_for_quad_vectors): Replace with ...
>    (add_options_for_double_vectors): ... this.
>    * gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
>     support multiple vector sizes since the vectorizer attempts to
>     vectorize with both vector sizes.
>    * gcc.dg/vect/no-vfa-vect-79.c,
>     gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
>     gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
>     gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
>     gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
>     gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
>     gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
>    * gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
>    * gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
>    gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
>    gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
>    gcc.dg/vect/vect-40.c: Likewise.
>   * gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
>    redundant.
>   * gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
>    gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
>    gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
>    gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
>    Likewise.
>  * gcc.dg/vect/vect-peel-4.c: Make ia global.
> 

Ok with the following change:

>  static unsigned int
>  arm_autovectorize_vector_sizes (void)
>  {
> -  return TARGET_NEON_VECTORIZE_QUAD ? 16 | 8 : 0;
> +  return TARGET_NEON_VECTORIZE_DOUBLE ? 0 : 16 | 8;
>  }


Please put parentheses round the expression to make the precedence explicit.

R.
Ira Rosen Sept. 6, 2011, 11:36 a.m. UTC | #2
On 17 August 2011 15:49, Richard Earnshaw <rearnsha@arm.com> wrote:
> On 16/08/11 10:28, Ira Rosen wrote:
>> Hi,
>>
>> This patch changes the default vector size for auto-vectorization on
>> ARM NEON to 128 bits. This new version is a result of a discussion
>> with Richard and Ramana.
>>
>> wwwdocs changes will follow shortly.
>>
>> Bootstrapped and tested on arm-linux-gnueabi. The testsuite changes
>> were also checked on powerpc64-suse-linux and x86_64-suse-linux.
>>
>> There is one new failure:
>> gcc.c-torture/execute/mode-dependent-address.c fails with -O3
>> -funroll-loops with this patch or with -mvectorize-with-neon-quad.
>> Ramana has a patch to fix this
>> http://gcc.gnu.org/ml/gcc/2011-08/msg00284.html. I will wait with
>> committing my patch until this issue is resolved.
>>
>> OK for mainline?
>>
>> Thanks,
>> Ira
>>
>> ChangeLog:
>>
>>    * config/arm/arm.c (arm_preferred_simd_mode): Check
>>    TARGET_NEON_VECTORIZE_DOUBLE instead of
>>    TARGET_NEON_VECTORIZE_QUAD.
>>    (arm_expand_sync): Likewise.
>>    * config/arm/arm.opt (mvectorize-with-neon-quad): Make inverse
>>    mask of mvectorize-with-neon-double.  Add RejectNegative.
>>    (mvectorize-with-neon-double): New.
>>
>> testsuite/ChangeLog:
>>
>>    * lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
>>    New procedure.
>>    (add_options_for_quad_vectors): Replace with ...
>>    (add_options_for_double_vectors): ... this.
>>    * gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
>>     support multiple vector sizes since the vectorizer attempts to
>>     vectorize with both vector sizes.
>>    * gcc.dg/vect/no-vfa-vect-79.c,
>>     gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
>>     gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
>>     gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
>>     gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
>>     gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
>>     gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
>>    * gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
>>    * gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
>>    gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
>>    gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
>>    gcc.dg/vect/vect-40.c: Likewise.
>>   * gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
>>    redundant.
>>   * gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
>>    gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
>>    gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
>>    gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
>>    Likewise.
>>  * gcc.dg/vect/vect-peel-4.c: Make ia global.
>>
>
> Ok with the following change:
>
>>  static unsigned int
>>  arm_autovectorize_vector_sizes (void)
>>  {
>> -  return TARGET_NEON_VECTORIZE_QUAD ? 16 | 8 : 0;
>> +  return TARGET_NEON_VECTORIZE_DOUBLE ? 0 : 16 | 8;
>>  }
>
>
> Please put parentheses round the expression to make the precedence explicit.

I added parentheses and committed the patch.

Thanks,
Ira

>
> R.
>
>
diff mbox

Patch

Index: arm.c
===================================================================
--- arm.c       (revision 177426)
+++ arm.c       (working copy)
@@ -22767,15 +22767,15 @@  arm_preferred_simd_mode (enum machine_mode mode)
     switch (mode)
       {
       case SFmode:
-       return TARGET_NEON_VECTORIZE_QUAD ? V4SFmode : V2SFmode;
+        return TARGET_NEON_VECTORIZE_DOUBLE ? V2SFmode : V4SFmode;
       case SImode:
-       return TARGET_NEON_VECTORIZE_QUAD ? V4SImode : V2SImode;
+        return TARGET_NEON_VECTORIZE_DOUBLE ? V2SImode : V4SImode;
       case HImode:
-       return TARGET_NEON_VECTORIZE_QUAD ? V8HImode : V4HImode;
+        return TARGET_NEON_VECTORIZE_DOUBLE ? V4HImode : V8HImode;
       case QImode:
-       return TARGET_NEON_VECTORIZE_QUAD ? V16QImode : V8QImode;
+        return TARGET_NEON_VECTORIZE_DOUBLE ? V8QImode : V16QImode;
       case DImode:
-       if (TARGET_NEON_VECTORIZE_QUAD)
+        if (!TARGET_NEON_VECTORIZE_DOUBLE)
          return V2DImode;
        break;

@@ -23998,7 +23998,7 @@  arm_expand_sync (enum machine_mode mode,
 static unsigned int
 arm_autovectorize_vector_sizes (void)
 {
-  return TARGET_NEON_VECTORIZE_QUAD ? 16 | 8 : 0;
+  return TARGET_NEON_VECTORIZE_DOUBLE ? 0 : 16 | 8;
 }

 static bool
Index: arm.opt
===================================================================
--- arm.opt     (revision 177426)
+++ arm.opt     (working copy)
@@ -238,9 +238,13 @@  Target Report RejectNegative Mask(LITTLE_WORDS)
 Assume big endian bytes, little endian words.  This option is deprecated.

 mvectorize-with-neon-quad
-Target Report Mask(NEON_VECTORIZE_QUAD)
+Target Report RejectNegative InverseMask(NEON_VECTORIZE_DOUBLE)
 Use Neon quad-word (rather than double-word) registers for vectorization

+mvectorize-with-neon-double
+Target Report RejectNegative Mask(NEON_VECTORIZE_DOUBLE)
+Use Neon double-word (rather than quad-word) registers for vectorization
+
 mword-relocations
 Target Report Var(target_word_relocations)
Init(TARGET_DEFAULT_WORD_RELOCATIONS)