From: Richard Sandiford Date: Thu, 21 Dec 2017 07:02:53 +0000 (+0000) Subject: poly_int: compute_data_ref_alignment X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8944b5b36e04894f7a0768440e3253400c3c7857;p=gcc.git 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 Alan Hayward David Sherwood 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 Co-Authored-By: David Sherwood From-SVN: r255935 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2a69053477c..6d924992054 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-12-21 Richard Sandiford + Alan Hayward + David Sherwood + + * 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. + 2017-12-21 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 7d039185446..014862a5b1b 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 ()) {