Message ID | 20151120151018.GJ42296@msticlxl57.ims.intel.com |
---|---|
State | New |
Headers | show |
On Fri, Nov 20, 2015 at 4:10 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote: > On 20 Nov 14:31, Ilya Enkovich wrote: >> 2015-11-20 14:28 GMT+03:00 Richard Biener <richard.guenther@gmail.com>: >> > On Wed, Nov 18, 2015 at 2:53 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote: >> >> 2015-11-18 16:44 GMT+03:00 Richard Biener <richard.guenther@gmail.com>: >> >>> On Wed, Nov 18, 2015 at 12:34 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote: >> >>>> Hi, >> >>>> >> >>>> When we compute vectypes we skip non-relevant phi nodes. But we process non-relevant alive statements and thus may need vectype of non-relevant live phi node to compute mask vectype. This patch enables vectype computation for live phi nodes. Botostrapped and regtested on x86_64-unknown-linux-gnu. OK for trunk? >> >>> >> >>> Hmm. What breaks if you instead skip all !relevant stmts and not >> >>> compute vectype for life but not relevant ones? We won't ever >> >>> "vectorize" !relevant ones, that is, we don't need their vector type. >> >> >> >> I tried it and got regression in SLP. It expected non-null vectype >> >> for non-releveant but live statement. Regression was in >> >> gcc/gcc/testsuite/gfortran.fortran-torture/execute/pr43390.f90 >> > >> > Because somebody put a vector type check before >> > >> > if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) >> > return false; >> > >> > @@ -7590,6 +7651,9 @@ vectorizable_comparison (gimple *stmt, g >> > tree mask_type; >> > tree mask; >> > >> > + if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) >> > + return false; >> > + >> > if (!VECTOR_BOOLEAN_TYPE_P (vectype)) >> > return false; >> > >> > @@ -7602,8 +7666,6 @@ vectorizable_comparison (gimple *stmt, g >> > ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; >> > >> > gcc_assert (ncopies >= 1); >> > - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) >> > - return false; >> > >> > if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def >> > && !(STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle >> > >> > fixes this particular fallout for me. >> >> I'll try it. > > With this fix it works fine, thanks! Bootstrapped and regtested on x86_64-unknown-linux-gnu. OK for trunk? Ok. Thanks, Richard. > Ilya > -- > gcc/ > > 2015-11-20 Ilya Enkovich <enkovich.gnu@gmail.com> > Richard Biener <rguenther@suse.de> > > * tree-vect-loop.c (vect_determine_vectorization_factor): Don't > compute vectype for non-relevant mask producers. > * gcc/tree-vect-stmts.c (vectorizable_comparison): Check stmt > relevance earlier. > > gcc/testsuite/ > > 2015-11-20 Ilya Enkovich <enkovich.gnu@gmail.com> > > * gcc.dg/pr68327.c: New test. > > > diff --git a/gcc/testsuite/gcc.dg/pr68327.c b/gcc/testsuite/gcc.dg/pr68327.c > new file mode 100644 > index 0000000..c3e6a94 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/pr68327.c > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3" } */ > + > +int a, d; > +char b, c; > + > +void > +fn1 () > +{ > + int i = 0; > + for (; i < 1; i++) > + d = 1; > + for (; b; b++) > + a = 1 && (d & b); > +} > diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c > index 80937ec..592372d 100644 > --- a/gcc/tree-vect-loop.c > +++ b/gcc/tree-vect-loop.c > @@ -439,7 +439,8 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) > compute a factor. */ > if (TREE_CODE (scalar_type) == BOOLEAN_TYPE) > { > - mask_producers.safe_push (stmt_info); > + if (STMT_VINFO_RELEVANT_P (stmt_info)) > + mask_producers.safe_push (stmt_info); > bool_result = true; > > if (gimple_code (stmt) == GIMPLE_ASSIGN > diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c > index 0f64aaf..3723b26 100644 > --- a/gcc/tree-vect-stmts.c > +++ b/gcc/tree-vect-stmts.c > @@ -7546,6 +7546,9 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi, > tree mask_type; > tree mask; > > + if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) > + return false; > + > if (!VECTOR_BOOLEAN_TYPE_P (vectype)) > return false; > > @@ -7558,9 +7561,6 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi, > ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; > > gcc_assert (ncopies >= 1); > - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) > - return false; > - > if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def > && !(STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle > && reduc_def))
diff --git a/gcc/testsuite/gcc.dg/pr68327.c b/gcc/testsuite/gcc.dg/pr68327.c new file mode 100644 index 0000000..c3e6a94 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr68327.c @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +int a, d; +char b, c; + +void +fn1 () +{ + int i = 0; + for (; i < 1; i++) + d = 1; + for (; b; b++) + a = 1 && (d & b); +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 80937ec..592372d 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -439,7 +439,8 @@ vect_determine_vectorization_factor (loop_vec_info loop_vinfo) compute a factor. */ if (TREE_CODE (scalar_type) == BOOLEAN_TYPE) { - mask_producers.safe_push (stmt_info); + if (STMT_VINFO_RELEVANT_P (stmt_info)) + mask_producers.safe_push (stmt_info); bool_result = true; if (gimple_code (stmt) == GIMPLE_ASSIGN diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 0f64aaf..3723b26 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -7546,6 +7546,9 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi, tree mask_type; tree mask; + if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) + return false; + if (!VECTOR_BOOLEAN_TYPE_P (vectype)) return false; @@ -7558,9 +7561,6 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi, ncopies = LOOP_VINFO_VECT_FACTOR (loop_vinfo) / nunits; gcc_assert (ncopies >= 1); - if (!STMT_VINFO_RELEVANT_P (stmt_info) && !bb_vinfo) - return false; - if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def && !(STMT_VINFO_DEF_TYPE (stmt_info) == vect_nested_cycle && reduc_def))