diff options
author | Revital Eres <eres@il.ibm.com> | 2009-09-15 10:39:13 +0000 |
---|---|---|
committer | Revital Eres <revitale@gcc.gnu.org> | 2009-09-15 10:39:13 +0000 |
commit | 0601d0cf823bca6293bea3b017e668be2361ed04 (patch) | |
tree | 6da5176cd614d338ccf9a4e80eb154a56282eeb5 /gcc/tree-vect-data-refs.c | |
parent | e5e447966658e7be35927f8ba65b20933b052b26 (diff) | |
download | gcc-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.c | 40 |
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; } |