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-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@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. Index: gcc/tree-vect-data-refs.c =================================================================== --- gcc/tree-vect-data-refs.c 2017-10-23 17:22:18.234826257 +0100 +++ gcc/tree-vect-data-refs.c 2017-10-23 17:22:24.456074525 +0100 @@ -944,8 +944,8 @@ vect_compute_data_ref_alignment (struct 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 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 ()) {