aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorRevital Eres <eres@il.ibm.com>2009-09-15 10:39:13 +0000
committerRevital Eres <revitale@gcc.gnu.org>2009-09-15 10:39:13 +0000
commit0601d0cf823bca6293bea3b017e668be2361ed04 (patch)
tree6da5176cd614d338ccf9a4e80eb154a56282eeb5 /gcc/tree-vect-data-refs.c
parente5e447966658e7be35927f8ba65b20933b052b26 (diff)
downloadgcc-0601d0cf823bca6293bea3b017e668be2361ed04.zip
gcc-0601d0cf823bca6293bea3b017e668be2361ed04.tar.gz
gcc-0601d0cf823bca6293bea3b017e668be2361ed04.tar.bz2
New function for checking misalignment
From-SVN: r151715
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index facde06..bc18f02 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -3455,6 +3455,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
@@ -3468,18 +3471,39 @@ vect_supportable_dr_alignment (struct data_reference *dr)
else
return dr_explicit_realign_optimized;
}
-
- if (optab_handler (movmisalign_optab, mode)->insn_code !=
- CODE_FOR_nothing)
+ if (!known_alignment_for_access_p (dr))
+ {
+ tree ba = DR_BASE_OBJECT (dr);
+
+ if (ba)
+ is_packed = contains_packed_reference (ba);
+ }
+
+ 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;
}
- else
- {
- if (movmisalign_optab->handlers[mode].insn_code != CODE_FOR_nothing)
- return dr_unaligned_supported;
- }
+ else
+ {
+ bool is_packed = false;
+ tree type = (TREE_TYPE (DR_REF (dr)));
+ if (!known_alignment_for_access_p (dr))
+ {
+ tree ba = DR_BASE_OBJECT (dr);
+
+ if (ba)
+ is_packed = contains_packed_reference (ba);
+ }
+
+ if (targetm.vectorize.
+ builtin_support_vector_misalignment (mode, type,
+ DR_MISALIGNMENT (dr), is_packed))
+ return dr_unaligned_supported;
+ }
+
/* Unsupported. */
return dr_unaligned_unsupported;
}