diff options
author | revitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-17 05:56:56 +0000 |
---|---|---|
committer | revitale <revitale@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-17 05:56:56 +0000 |
commit | 9afb2990c0513ae703c4205abf7cb1b09bbbff2c (patch) | |
tree | fcb602321b597dc1b4fee94d519f5a3707c4fff6 | |
parent | 2c6f25d388dd08756d2b28e81ca6fb0a1d13871c (diff) |
New function for checking misalignment
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/ibm/gcc-4_3-branch@151786 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog.power7 | 17 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 39 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 8 | ||||
-rw-r--r-- | gcc/target-def.h | 5 | ||||
-rw-r--r-- | gcc/target.h | 5 | ||||
-rw-r--r-- | gcc/targhooks.c | 17 | ||||
-rw-r--r-- | gcc/targhooks.h | 4 | ||||
-rw-r--r-- | gcc/tree-vectorizer.c | 15 |
8 files changed, 107 insertions, 3 deletions
diff --git a/gcc/ChangeLog.power7 b/gcc/ChangeLog.power7 index 93b05db2eb7..25da653394d 100644 --- a/gcc/ChangeLog.power7 +++ b/gcc/ChangeLog.power7 @@ -1,3 +1,20 @@ +2009-09-17 Revital Eres <eres@il.ibm.com> + + * doc/tm.texi (TARGET_SUPPORT_VECTOR_MISALIGNMENT): Document. + * targhooks.c (default_builtin_support_vector_misalignment): + New builtin function. + * targhooks.h (default_builtin_support_vector_misalignment): + Declare. + * target.h (builtin_support_vector_misalignment): + New field in struct gcc_target. + * tree-vectorizer.c (vect_supportable_dr_alignment): Call + new builtin function. + * target-def.h (TARGET_SUPPORT_VECTOR_MISALIGNMENT): + Define. + * config/rs6000/rs6000.c + (rs6000_builtin_support_vector_misalignment): New function. + (TARGET_SUPPORT_VECTOR_MISALIGNMENT): Define. + 2009-07-28 Michael Meissner <meissner@linux.vnet.ibm.com> * config/rs6000/vector.md (vector_copysign<mode>3): Use diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 84735d82c12..0c9d96fc2df 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -924,6 +924,10 @@ static tree rs6000_builtin_mask_for_load (void); static tree rs6000_builtin_mul_widen_even (tree); static tree rs6000_builtin_mul_widen_odd (tree); static tree rs6000_builtin_conversion (enum tree_code, tree); +static bool rs6000_builtin_support_vector_misalignment (enum + machine_mode, + const_tree, + int, bool); static void def_builtin (int, const char *, tree, int); static bool rs6000_vector_alignment_reachable (const_tree, bool); @@ -1279,6 +1283,10 @@ static const char alt_reg_names[][8] = #undef TARGET_VECTOR_ALIGNMENT_REACHABLE #define TARGET_VECTOR_ALIGNMENT_REACHABLE rs6000_vector_alignment_reachable +#undef TARGET_SUPPORT_VECTOR_MISALIGNMENT +#define TARGET_SUPPORT_VECTOR_MISALIGNMENT \ + rs6000_builtin_support_vector_misalignment + #undef TARGET_INIT_BUILTINS #define TARGET_INIT_BUILTINS rs6000_init_builtins @@ -2863,6 +2871,37 @@ rs6000_vector_alignment_reachable (const_tree type ATTRIBUTE_UNUSED, bool is_pac } } +/* Return true if the vector misalignment factor is supported by the + target. */ +bool +rs6000_builtin_support_vector_misalignment (enum machine_mode mode, + const_tree type, + int misalignment, + bool is_packed) +{ + if (TARGET_VSX) + { + /* Return if movmisalign pattern is not supported for this mode. */ + if (optab_handler (movmisalign_optab, mode)->insn_code == + CODE_FOR_nothing) + return false; + + if (misalignment == -1) + { + /* misalignment factor is unknown at compile time but we know + it's word aligned. */ + if (rs6000_vector_alignment_reachable (type, is_packed)) + return true; + return false; + } + /* VSX supports word-aligned vector. */ + if (misalignment % 4 == 0) + return true; + } + return false; +} + + /* Handle generic options of the form -mfoo=yes/no. NAME is the option name. VALUE is the option value. diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 5e37f27b48a..580aa86586a 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -5541,6 +5541,14 @@ the vectorized function shall be of vector type @var{vec_type_out} and the argument types should be @var{vec_type_in}. @end deftypefn +@deftypefn {Target Hook} bool TARGET_SUPPORT_VECTOR_MISALIGNMENT (enum machine_mode @var{mode}, tree @var{type}, int @var{misalignment}, bool @var{is_packed}) +This hook should return true if the target supports misaligned vector +store/load of a specific factor denoted in the @var{misalignment} +parameter. The vector store/load should be of machine mode @var{mode} and +the elements in the vectors should be of type @var{type}. @var{is_packed} +parameter is true if the memory access is defined in a packed struct. +@end deftypefn + @node Anchored Addresses @section Anchored Addresses @cindex anchored addresses diff --git a/gcc/target-def.h b/gcc/target-def.h index 9d9c5d94554..8f1d2e8db79 100644 --- a/gcc/target-def.h +++ b/gcc/target-def.h @@ -364,6 +364,8 @@ #define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST 0 #define TARGET_VECTOR_ALIGNMENT_REACHABLE \ default_builtin_vector_alignment_reachable +#define TARGET_SUPPORT_VECTOR_MISALIGNMENT \ + default_builtin_support_vector_misalignment #define TARGET_VECTORIZE \ { \ @@ -373,7 +375,8 @@ TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_EVEN, \ TARGET_VECTORIZE_BUILTIN_MUL_WIDEN_ODD, \ TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST, \ - TARGET_VECTOR_ALIGNMENT_REACHABLE \ + TARGET_VECTOR_ALIGNMENT_REACHABLE, \ + TARGET_SUPPORT_VECTOR_MISALIGNMENT \ } #define TARGET_DEFAULT_TARGET_FLAGS 0 diff --git a/gcc/target.h b/gcc/target.h index eb391c5e9c3..b1b900e1dca 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -438,6 +438,11 @@ struct gcc_target /* Return true if vector alignment is reachable (by peeling N iterations) for the given type. */ bool (* vector_alignment_reachable) (const_tree, bool); + /* Return true if the target supports misaligned store/load of a + specific factor denoted in the third parameter. The last parameter + is true if the access is defined in a packed struct. */ + bool (* builtin_support_vector_misalignment) (enum machine_mode, + const_tree, int, bool); } vectorize; /* The initial value of target_flags. */ diff --git a/gcc/targhooks.c b/gcc/targhooks.c index e995ec9d69a..274ac684cc5 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -691,6 +691,23 @@ tree default_mangle_decl_assembler_name (tree decl ATTRIBUTE_UNUSED, return id; } +/* By default, assume that a target supports any factor of misalignment + memory access if it supports movmisalign patten. + is_packed is true if the memory access is defined in a packed struct. */ +bool +default_builtin_support_vector_misalignment (enum machine_mode mode, + const_tree type + ATTRIBUTE_UNUSED, + int misalignment + ATTRIBUTE_UNUSED, + bool is_packed + ATTRIBUTE_UNUSED) +{ + if (optab_handler (movmisalign_optab, mode)->insn_code != CODE_FOR_nothing) + return true; + return false; +} + bool default_builtin_vector_alignment_reachable (const_tree type, bool is_packed) { diff --git a/gcc/targhooks.h b/gcc/targhooks.h index 1018eb5f653..45f41b1108a 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -70,6 +70,10 @@ extern tree default_builtin_vectorized_conversion (enum tree_code, tree); extern tree default_builtin_reciprocal (enum built_in_function, bool, bool); extern bool default_builtin_vector_alignment_reachable (const_tree, bool); +extern bool +default_builtin_support_vector_misalignment (enum machine_mode mode, + const_tree, + int, bool); /* 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. */ diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index 6e2cccaec2d..7d595f469a6 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1938,6 +1938,9 @@ vect_supportable_dr_alignment (struct data_reference *dr) if (DR_IS_READ (dr)) { + bool is_packed = false; + tree type = (TREE_TYPE (DR_REF (dr))); + if (optab_handler (vec_realign_load_optab, mode)->insn_code != CODE_FOR_nothing && (!targetm.vectorize.builtin_mask_for_load @@ -1949,9 +1952,17 @@ vect_supportable_dr_alignment (struct data_reference *dr) else return dr_explicit_realign_optimized; } + if (!known_alignment_for_access_p (dr)) + { + tree ba = DR_BASE_OBJECT (dr); + + if (ba) + is_packed = contains_packed_reference (ba); + } - if (optab_handler (movmisalign_optab, mode)->insn_code != - CODE_FOR_nothing) + if (targetm.vectorize. + builtin_support_vector_misalignment (mode, type, + DR_MISALIGNMENT (dr), is_packed)) /* Can't software pipeline the loads, but can at least do them. */ return dr_unaligned_supported; } |