File gcc-power7-sles-11sp1.patch02c of Package gcc43
2009-10-15 Michael Meissner <meissner@linux.vnet.ibm.com>
Pat Haugen <pthaugen@us.ibm.com>
Revital Eres <ERES@il.ibm.com>
Peter Bergner <bergner@vnet.ibm.com>
Backport rs6000 changes from GCC 4.5 mainline to 4.3 that includes
improved support for vector misalignment.
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.
diff -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/target-def.h sles-11sp1/gcc/target-def.h
--- sles-11sp1-orig/gcc/target-def.h 2008-06-30 07:54:13.000000000 -0400
+++ sles-11sp1/gcc/target-def.h 2009-10-13 13:01:47.000000000 -0400
@@ -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 -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/target.h sles-11sp1/gcc/target.h
--- sles-11sp1-orig/gcc/target.h 2008-06-30 07:54:12.000000000 -0400
+++ sles-11sp1/gcc/target.h 2009-10-13 13:00:59.000000000 -0400
@@ -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 -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/targhooks.c sles-11sp1/gcc/targhooks.c
--- sles-11sp1-orig/gcc/targhooks.c 2008-06-30 07:54:12.000000000 -0400
+++ sles-11sp1/gcc/targhooks.c 2009-10-13 13:00:36.000000000 -0400
@@ -691,6 +691,23 @@ tree default_mangle_decl_assembler_name
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 -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/targhooks.h sles-11sp1/gcc/targhooks.h
--- sles-11sp1-orig/gcc/targhooks.h 2008-06-30 07:54:12.000000000 -0400
+++ sles-11sp1/gcc/targhooks.h 2009-10-13 13:00:47.000000000 -0400
@@ -70,6 +70,10 @@ extern tree default_builtin_vectorized_c
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 -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/tree-vectorizer.c sles-11sp1/gcc/tree-vectorizer.c
--- sles-11sp1-orig/gcc/tree-vectorizer.c 2009-10-09 17:11:06.000000000 -0400
+++ sles-11sp1/gcc/tree-vectorizer.c 2009-10-13 13:01:17.000000000 -0400
@@ -1938,6 +1938,9 @@ vect_supportable_dr_alignment (struct da
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 da
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;
}
diff -rupN --exclude='*~' --exclude=autom4te.cache sles-11sp1-orig/gcc/doc/tm.texi sles-11sp1/gcc/doc/tm.texi
--- sles-11sp1-orig/gcc/doc/tm.texi 2009-10-09 17:15:53.000000000 -0400
+++ sles-11sp1/gcc/doc/tm.texi 2009-10-13 13:00:13.000000000 -0400
@@ -5541,6 +5541,14 @@ the vectorized function shall be of vect
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