aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-data-refs.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-12-21 07:02:53 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-12-21 07:02:53 +0000
commit8944b5b36e04894f7a0768440e3253400c3c7857 (patch)
tree766896dfe4d80dff7d71436e756913e05a53633e /gcc/tree-vect-data-refs.c
parenta696bc4fec986318a1765c31ac9ee2db3849934a (diff)
downloadgcc-8944b5b36e04894f7a0768440e3253400c3c7857.zip
gcc-8944b5b36e04894f7a0768440e3253400c3c7857.tar.gz
gcc-8944b5b36e04894f7a0768440e3253400c3c7857.tar.bz2
poly_int: compute_data_ref_alignment
This patch makes vect_compute_data_ref_alignment treat DR_INIT as a poly_int and handles cases in which the calculated misalignment might not be constant. 2017-12-21 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Treat drb->init as a poly_int. Fail if its misalignment wrt vector_alignment isn't known. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r255935
Diffstat (limited to 'gcc/tree-vect-data-refs.c')
-rw-r--r--gcc/tree-vect-data-refs.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c
index 7d039185..014862a 100644
--- a/gcc/tree-vect-data-refs.c
+++ b/gcc/tree-vect-data-refs.c
@@ -944,8 +944,8 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
DR_VECT_AUX (dr)->base_misaligned = true;
base_misalignment = 0;
}
- unsigned int misalignment = (base_misalignment
- + TREE_INT_CST_LOW (drb->init));
+ poly_int64 misalignment
+ = base_misalignment + wi::to_poly_offset (drb->init).force_shwi ();
/* If this is a backward running DR then first access in the larger
vectype actually is N-1 elements before the address in the DR.
@@ -955,7 +955,21 @@ vect_compute_data_ref_alignment (struct data_reference *dr)
misalignment += ((TYPE_VECTOR_SUBPARTS (vectype) - 1)
* TREE_INT_CST_LOW (drb->step));
- SET_DR_MISALIGNMENT (dr, misalignment & (vector_alignment - 1));
+ unsigned int const_misalignment;
+ if (!known_misalignment (misalignment, vector_alignment,
+ &const_misalignment))
+ {
+ if (dump_enabled_p ())
+ {
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "Non-constant misalignment for access: ");
+ dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM, ref);
+ dump_printf (MSG_MISSED_OPTIMIZATION, "\n");
+ }
+ return true;
+ }
+
+ SET_DR_MISALIGNMENT (dr, const_misalignment);
if (dump_enabled_p ())
{