This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR tree-optimization/71655] Fix LE and LT masks comparison cases
- 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: Tue, 28 Jun 2016 15:46:11 +0200
- Subject: Re: [PATCH, PR tree-optimization/71655] Fix LE and LT masks comparison cases
- Authentication-results: sourceware.org; auth=none
- References: <20160628112645 dot GA4143 at msticlxl57 dot ims dot intel dot com>
On Tue, Jun 28, 2016 at 1:26 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> Hi,
>
> Currently we use operands swap when compare masks using LT and LE codes.
> Operands swap misses swap for their definition types and this patch
> fixes it. Testing is in progress. OK for trunk if pass?
Ok.
Thanks,
Richard.
> Thanks,
> Ilya
> --
> gcc/
>
> 2016-06-28 Ilya Enkovich <ilya.enkovich@intel.com>
>
> * tree-vect-stmts.c (vectorizable_comparison): Swap definition
> types when swapping operands.
>
> gcc/testsuite/
>
> 2016-06-28 Ilya Enkovich <ilya.enkovich@intel.com>
>
> * g++.dg/pr71655.C: New test.
>
>
> diff --git a/gcc/testsuite/g++.dg/pr71655.C b/gcc/testsuite/g++.dg/pr71655.C
> new file mode 100644
> index 0000000..8ed3371
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr71655.C
> @@ -0,0 +1,28 @@
> +// PR tree-optimization/71655
> +// { dg-do compile }
> +// { dg-options "-O3 -std=c++11" }
> +// { dg-additional-options "-msse4" { target i?86-*-* x86_64-*-* } }
> +
> +#include <functional>
> +#include <valarray>
> +extern int var_16, le_s5, le_s6, le_s9;
> +std::array<std::array<std::array<long, 8>, 4>, 24> v4;
> +extern std::array<std::array<int, 48>, 18> v15;
> +
> +void fn1() {
> + for (int k0 = 0;;)
> + for (int i1 = 0;;)
> + for (int j1 = 0; j1 < le_s9; j1 = j1 + 1) {
> + std::valarray<std::valarray<short>> v15_;
> + for (; le_s5;) {
> + std::array<std::array<std::array<int, 3>, 48>, 18> v16;
> + for (int k2 = 0;; k2 = 1)
> + for (int l2 = 2; l2 < 6; l2 = l2 + 1)
> + for (int k3 = 0; le_s6;)
> + for (int i4 = 0; i4 < le_s9; i4 = i4 + 1)
> + *(i4 + (*v16.begin())[k3].begin()) =
> + (v15[k2][l2] || var_16) >
> + unsigned(i1 <= (*v4.begin()).at(k0).at(j1));
> + }
> + }
> +}
> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
> index 5c65502..c41550d 100644
> --- a/gcc/tree-vect-stmts.c
> +++ b/gcc/tree-vect-stmts.c
> @@ -7858,12 +7858,14 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi,
> bitop1 = BIT_NOT_EXPR;
> bitop2 = BIT_AND_EXPR;
> std::swap (rhs1, rhs2);
> + std::swap (dts[0], dts[1]);
> }
> else if (code == LE_EXPR)
> {
> bitop1 = BIT_NOT_EXPR;
> bitop2 = BIT_IOR_EXPR;
> std::swap (rhs1, rhs2);
> + std::swap (dts[0], dts[1]);
> }
> else
> {