From 767f865fb828fba54459911661d15289e1a42930 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Thu, 7 Oct 2010 14:35:38 +0000 Subject: [PATCH] target.def (autovectorize_vector_sizes): New target hook. 2010-10-07 Richard Guenther * target.def (autovectorize_vector_sizes): New target hook. * targhooks.c (default_autovectorize_vector_sizes): New function. * targhooks.h (default_autovectorize_vector_sizes): Declare. * doc/tm.texi.in (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Document. * doc/tm.texi: Update. * config/i386/i386.c (ix86_autovectorize_vector_sizes): New function. (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Define. From-SVN: r165115 --- gcc/ChangeLog | 11 +++++++++++ gcc/config/i386/i386.c | 12 ++++++++++++ gcc/doc/tm.texi | 7 +++++++ gcc/doc/tm.texi.in | 7 +++++++ gcc/target.def | 9 +++++++++ gcc/targhooks.c | 9 +++++++++ gcc/targhooks.h | 1 + 7 files changed, 56 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 20df6bb94b2..94eada1f1cf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2010-10-07 Richard Guenther + + * target.def (autovectorize_vector_sizes): New target hook. + * targhooks.c (default_autovectorize_vector_sizes): New function. + * targhooks.h (default_autovectorize_vector_sizes): Declare. + * doc/tm.texi.in (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): + Document. + * doc/tm.texi: Update. + * config/i386/i386.c (ix86_autovectorize_vector_sizes): New function. + (TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES): Define. + 2010-10-07 Richard Guenther * target.def (units_per_simd_word): Rename to ... diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 74ded78f800..39308cf5918 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -32993,6 +32993,15 @@ ix86_preferred_simd_mode (enum machine_mode mode) return word_mode; } +/* If AVX is enabled then try vectorizing with both 256bit and 128bit + vectors. */ + +static unsigned int +ix86_autovectorize_vector_sizes (void) +{ + return TARGET_AVX ? 32 | 16 : 0; +} + /* Initialize the GCC target structure. */ #undef TARGET_RETURN_IN_MEMORY #define TARGET_RETURN_IN_MEMORY ix86_return_in_memory @@ -33253,6 +33262,9 @@ ix86_preferred_simd_mode (enum machine_mode mode) #undef TARGET_VECTORIZE_PREFERRED_SIMD_MODE #define TARGET_VECTORIZE_PREFERRED_SIMD_MODE \ ix86_preferred_simd_mode +#undef TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES +#define TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES \ + ix86_autovectorize_vector_sizes #undef TARGET_SET_CURRENT_FUNCTION #define TARGET_SET_CURRENT_FUNCTION ix86_set_current_function diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index afa1971695e..faa72502df7 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5750,6 +5750,13 @@ equal to @code{word_mode}, because the vectorizer can do some transformations even in absence of specialized @acronym{SIMD} hardware. @end deftypefn +@deftypefn {Target Hook} {unsigned int} TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES (void) +This hook should return a mask of sizes that should be iterated over +after trying to autovectorize using the vector size derived from the +mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}. +The default is zero which means to not iterate over other vector sizes. +@end deftypefn + @node Anchored Addresses @section Anchored Addresses @cindex anchored addresses diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index 8489027e41b..cdd9a224ea1 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -5748,6 +5748,13 @@ equal to @code{word_mode}, because the vectorizer can do some transformations even in absence of specialized @acronym{SIMD} hardware. @end deftypefn +@hook TARGET_VECTORIZE_AUTOVECTORIZE_VECTOR_SIZES +This hook should return a mask of sizes that should be iterated over +after trying to autovectorize using the vector size derived from the +mode returned by @code{TARGET_VECTORIZE_PREFERRED_SIMD_MODE}. +The default is zero which means to not iterate over other vector sizes. +@end deftypefn + @node Anchored Addresses @section Anchored Addresses @cindex anchored addresses diff --git a/gcc/target.def b/gcc/target.def index f104ae8069e..266870a6e99 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -889,6 +889,15 @@ DEFHOOK (enum machine_mode mode), default_preferred_simd_mode) +/* Returns a mask of vector sizes to iterate over when auto-vectorizing + after processing the preferred one derived from preferred_simd_mode. */ +DEFHOOK +(autovectorize_vector_sizes, + "", + unsigned int, + (void), + default_autovectorize_vector_sizes) + HOOK_VECTOR_END (vectorize) #undef HOOK_PREFIX diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 0a65b2acc92..9d7ebc0a474 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -985,6 +985,15 @@ default_preferred_simd_mode (enum machine_mode mode ATTRIBUTE_UNUSED) return word_mode; } +/* By default only the size derived from the preferred vector mode + is tried. */ + +unsigned int +default_autovectorize_vector_sizes (void) +{ + return 0; +} + /* Determine whether or not a pointer mode is valid. Assume defaults of ptr_mode or Pmode - can be overridden. */ bool diff --git a/gcc/targhooks.h b/gcc/targhooks.h index a705d7e8586..920c91830d1 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -87,6 +87,7 @@ default_builtin_support_vector_misalignment (enum machine_mode mode, const_tree, int, bool); extern enum machine_mode default_preferred_simd_mode (enum machine_mode mode); +extern unsigned int default_autovectorize_vector_sizes (void); /* These are here, and not in hooks.[ch], because not all users of hooks.h include tm.h, and thus we don't have CUMULATIVE_ARGS. */