On Tue, Jun 28, 2016 at 1:26 PM, Ilya Enkovich <enkovich....@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.enkov...@intel.com> > > * tree-vect-stmts.c (vectorizable_comparison): Swap definition > types when swapping operands. > > gcc/testsuite/ > > 2016-06-28 Ilya Enkovich <ilya.enkov...@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 > {