diff mbox

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

Message ID 20160628112645.GA4143@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich June 28, 2016, 11:26 a.m. UTC
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?

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.

Comments

Richard Biener June 28, 2016, 1:46 p.m. UTC | #1
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
>         {
diff mbox

Patch

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
 	{