summaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-18 10:46:05 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2012-07-18 10:46:05 +0000
commitcfa724cfa2af2ff3b5fe23dd4a737410c7001f70 (patch)
treea29a811549836915e77e5838f455d345d6548dd7 /gcc/tree-vect-data-refs.c
parent3482bf1319f9e65a4783bbe9d5b59c11312888db (diff)
downloadgcc-cfa724cfa2af2ff3b5fe23dd4a737410c7001f70.tar.gz
2012-07-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/53970 * tree.h (contains_packed_reference): Remove. * expr.c (contains_packed_reference): Likewise. * tree-vect-data-refs.c (not_size_aligned): New function. (vector_alignment_reachable_p): Use it. (vect_supportable_dr_alignment): Likewise. * g++.dg/torture/pr53970.C: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189609 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index dd0752e69cf..147fa902cd6 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -1131,6 +1131,18 @@ vect_verify_datarefs_alignment (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
return true;
}
+/* Given an memory reference EXP return whether its alignment is less
+ than its size. */
+
+static bool
+not_size_aligned (tree exp)
+{
+ if (!host_integerp (TYPE_SIZE (TREE_TYPE (exp)), 1))
+ return true;
+
+ return (tree_low_cst (TYPE_SIZE (TREE_TYPE (exp)), 1)
+ > get_object_alignment (exp));
+}
/* Function vector_alignment_reachable_p
@@ -1184,12 +1196,8 @@ vector_alignment_reachable_p (struct data_reference *dr)
if (!known_alignment_for_access_p (dr))
{
- tree type = (TREE_TYPE (DR_REF (dr)));
- bool is_packed = contains_packed_reference (DR_REF (dr));
-
- if (compare_tree_int (TYPE_SIZE (type), TYPE_ALIGN (type)) > 0)
- is_packed = true;
-
+ tree type = TREE_TYPE (DR_REF (dr));
+ bool is_packed = not_size_aligned (DR_REF (dr));
if (vect_print_dump_info (REPORT_DETAILS))
fprintf (vect_dump, "Unknown misalignment, is_packed = %d",is_packed);
if (targetm.vectorize.vector_alignment_reachable (type, is_packed))
@@ -4863,7 +4871,7 @@ vect_supportable_dr_alignment (struct data_reference *dr,
return dr_explicit_realign_optimized;
}
if (!known_alignment_for_access_p (dr))
- is_packed = contains_packed_reference (DR_REF (dr));
+ is_packed = not_size_aligned (DR_REF (dr));
if (targetm.vectorize.
support_vector_misalignment (mode, type,
@@ -4877,7 +4885,7 @@ vect_supportable_dr_alignment (struct data_reference *dr,
tree type = (TREE_TYPE (DR_REF (dr)));
if (!known_alignment_for_access_p (dr))
- is_packed = contains_packed_reference (DR_REF (dr));
+ is_packed = not_size_aligned (DR_REF (dr));
if (targetm.vectorize.
support_vector_misalignment (mode, type,