This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, PR tree-optimization/71655] Fix LE and LT masks comparison cases


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
>         {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]