This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR tree-optimization/68327] Compute vectype for live phi nodes when copmputing VF
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 23 Nov 2015 10:40:03 +0100
- Subject: Re: [PATCH, PR tree-optimization/68327] Compute vectype for live phi nodes when copmputing VF
- Authentication-results: sourceware.org; auth=none
- References: <20151118110701 dot GB42296 at msticlxl57 dot ims dot intel dot com> <CAFiYyc03hAX76JyZQghmMNufspWyvwUBaYLE-ZUQ7=jkwqcmbQ at mail dot gmail dot com> <CAMbmDYb5n3f9=AWX=Pd18nXhGepu=EttRuF6QrNyQXsw54L=Yw at mail dot gmail dot com> <CAFiYyc2W0CQ=Dn8Q20+biwTTErHZVX3kXtwJ+kMFVUOc4asJzA at mail dot gmail dot com> <CAMbmDYb+6C5Gt6nVdhN+6UeV_fxQmMwZnEcP67BoqBNjCwB6wg at mail dot gmail dot com> <20151120151018 dot GJ42296 at msticlxl57 dot ims dot intel dot com>
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))