From 23a372296360f366e385c187c70a34b97cede2ab Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 27 Oct 2015 13:48:15 +0000 Subject: [PATCH] re PR tree-optimization/68104 (ice in vect_update_misalignment_for_peel with -O3) 2015-10-27 Richard Biener PR tree-optimization/68104 * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Move strided access check ... (vect_compute_data_refs_alignment): ... here. * gcc.dg/torture/pr68104.c: New testcase. From-SVN: r229440 --- gcc/ChangeLog | 7 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/torture/pr68104.c | 22 +++++++++++++++ gcc/tree-vect-data-refs.c | 39 ++++++++++++++------------ 4 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr68104.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80045dd9204..9659978a608 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-10-27 Richard Biener + + PR tree-optimization/68104 + * tree-vect-data-refs.c (vect_compute_data_ref_alignment): Move + strided access check ... + (vect_compute_data_refs_alignment): ... here. + 2015-10-27 Daniel Jacobowitz Joseph Myers Mark Shinwell diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e693063b4ad..bcadb0c3900 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-27 Richard Biener + + PR tree-optimization/68104 + * gcc.dg/torture/pr68104.c: New testcase. + 2015-10-27 Alan Lawrence * gcc.dg/vect/vect-strided-shift-1.c: New. diff --git a/gcc/testsuite/gcc.dg/torture/pr68104.c b/gcc/testsuite/gcc.dg/torture/pr68104.c new file mode 100644 index 00000000000..5db0282cdc7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr68104.c @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +typedef struct +{ + char vl; + char weight; +} ib_vl_arb_element_t; +typedef struct { ib_vl_arb_element_t vl_entry[32]; } ib_vl_arb_table_t; +typedef enum { IB_SUCCESS } ib_api_status_t; +int a, b, d; +char c; +void fn1(); +ib_api_status_t fn2() +{ + int e = b; + ib_vl_arb_table_t f; + if (e) + for (a = 0; a < d; a++) + f.vl_entry[a].vl &= c; + fn1(f); + return IB_SUCCESS; +} diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index b3ca9d6e1b8..51cea9ecb31 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -629,12 +629,6 @@ vect_compute_data_ref_alignment (struct data_reference *dr) /* Initialize misalignment to unknown. */ SET_DR_MISALIGNMENT (dr, -1); - /* Strided accesses perform only component accesses, misalignment information - is irrelevant for them. */ - if (STMT_VINFO_STRIDED_P (stmt_info) - && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) - return true; - if (tree_fits_shwi_p (DR_STEP (dr))) misalign = DR_INIT (dr); aligned_to = DR_ALIGNED_TO (dr); @@ -794,18 +788,27 @@ vect_compute_data_refs_alignment (vec_info *vinfo) unsigned int i; FOR_EACH_VEC_ELT (datarefs, i, dr) - if (STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (DR_STMT (dr))) - && !vect_compute_data_ref_alignment (dr)) - { - if (is_a (vinfo)) - { - /* Mark unsupported statement as unvectorizable. */ - STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (DR_STMT (dr))) = false; - continue; - } - else - return false; - } + { + stmt_vec_info stmt_info = vinfo_for_stmt (DR_STMT (dr)); + if (STMT_VINFO_VECTORIZABLE (stmt_info) + && !vect_compute_data_ref_alignment (dr)) + { + /* Strided accesses perform only component accesses, misalignment + information is irrelevant for them. */ + if (STMT_VINFO_STRIDED_P (stmt_info) + && !STMT_VINFO_GROUPED_ACCESS (stmt_info)) + continue; + + if (is_a (vinfo)) + { + /* Mark unsupported statement as unvectorizable. */ + STMT_VINFO_VECTORIZABLE (vinfo_for_stmt (DR_STMT (dr))) = false; + continue; + } + else + return false; + } + } return true; } -- 2.30.2