diff mbox

Fixing PR60656

Message ID CAK=A3=3ir=n9HBnuddbeNWOt7VO9pgNdG2wBu5Ah6+hbB7NxYw@mail.gmail.com
State New
Headers show

Commit Message

Cong Hou March 29, 2014, 1:26 a.m. UTC
This patch is fixing PR60656. Elements in a vector with
vect_used_by_reduction property cannot be reordered if the use chain
with this property does not have the same operation.

Bootstrapped and tested on a x86-64 machine.

OK for trunk?


thanks,
Cong


       break;

Comments

Richard Biener March 31, 2014, 7:59 a.m. UTC | #1
On Sat, Mar 29, 2014 at 2:26 AM, Cong Hou <congh@google.com> wrote:
> This patch is fixing PR60656. Elements in a vector with
> vect_used_by_reduction property cannot be reordered if the use chain
> with this property does not have the same operation.
>
> Bootstrapped and tested on a x86-64 machine.
>
> OK for trunk?

Ok, but please add a comment before the check that explains why we
reject this at this point.

Thanks,
Richard.

>
> thanks,
> Cong
>
>
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index e1d8666..d7d5b82 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,11 @@
> +2014-03-28  Cong Hou  <congh@google.com>
> +
> + PR tree-optimization/60656
> + * tree-vect-stmts.c (supportable_widening_operation):
> + Fix a bug that elements in a vector with vect_used_by_reduction
> + property are incorrectly reordered when the operation on it is not
> + consistant with the one in reduction operation.
> +
>  2014-03-10  Jakub Jelinek  <jakub@redhat.com>
>
>   PR ipa/60457
> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
> index 41b6875..414a745 100644
> --- a/gcc/testsuite/ChangeLog
> +++ b/gcc/testsuite/ChangeLog
> @@ -1,3 +1,8 @@
> +2014-03-28  Cong Hou  <congh@google.com>
> +
> + PR tree-optimization/60656
> + * gcc.dg/vect/pr60656.c: New test.
> +
>  2014-03-10  Jakub Jelinek  <jakub@redhat.com>
>
>   PR ipa/60457
> diff --git a/gcc/testsuite/gcc.dg/vect/pr60656.c
> b/gcc/testsuite/gcc.dg/vect/pr60656.c
> new file mode 100644
> index 0000000..ebaab62
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr60656.c
> @@ -0,0 +1,45 @@
> +/* { dg-require-effective-target vect_int } */
> +
> +#include "tree-vect.h"
> +
> +__attribute__ ((noinline)) long
> +foo ()
> +{
> +  int v[] = {5000, 5001, 5002, 5003};
> +  long s = 0;
> +  int i;
> +
> +  for(i = 0; i < 4; ++i)
> +    {
> +      long P = v[i];
> +      s += P*P*P;
> +    }
> +  return s;
> +}
> +
> +long
> +bar ()
> +{
> +  int v[] = {5000, 5001, 5002, 5003};
> +  long s = 0;
> +  int i;
> +
> +  for(i = 0; i < 4; ++i)
> +    {
> +      long P = v[i];
> +      s += P*P*P;
> +      __asm__ volatile ("");
> +    }
> +  return s;
> +}
> +
> +int main()
> +{
> +  if (foo () != bar ())
> +    abort ();
> +  return 0;
> +}
> +
> +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +
> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
> index 70fb411..7442d0c 100644
> --- a/gcc/tree-vect-stmts.c
> +++ b/gcc/tree-vect-stmts.c
> @@ -7827,7 +7827,16 @@ supportable_widening_operation (enum tree_code
> code, gimple stmt,
>       stmt, vectype_out, vectype_in,
>       code1, code2, multi_step_cvt,
>       interm_types))
> - return true;
> +        {
> +          tree lhs = gimple_assign_lhs (stmt);
> +          use_operand_p dummy;
> +          gimple use_stmt;
> +          stmt_vec_info use_stmt_info = NULL;
> +          if (single_imm_use (lhs, &dummy, &use_stmt)
> +              && (use_stmt_info = vinfo_for_stmt (use_stmt))
> +              && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
> +            return true;
> +        }
>        c1 = VEC_WIDEN_MULT_LO_EXPR;
>        c2 = VEC_WIDEN_MULT_HI_EXPR;
>        break;
Jeff Law April 4, 2014, 3:57 p.m. UTC | #2
On 03/28/14 19:26, Cong Hou wrote:
> This patch is fixing PR60656. Elements in a vector with
> vect_used_by_reduction property cannot be reordered if the use chain
> with this property does not have the same operation.
>
> Bootstrapped and tested on a x86-64 machine.
>
> OK for trunk?
>
>
> thanks,
> Cong
>
>
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index e1d8666..d7d5b82 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,11 @@
> +2014-03-28  Cong Hou  <congh@google.com>
> +
> + PR tree-optimization/60656
> + * tree-vect-stmts.c (supportable_widening_operation):
> + Fix a bug that elements in a vector with vect_used_by_reduction
> + property are incorrectly reordered when the operation on it is not
> + consistant with the one in reduction operation.
This is good.  Please install.

Thanks,
Jeff
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e1d8666..d7d5b82 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@ 
+2014-03-28  Cong Hou  <congh@google.com>
+
+ PR tree-optimization/60656
+ * tree-vect-stmts.c (supportable_widening_operation):
+ Fix a bug that elements in a vector with vect_used_by_reduction
+ property are incorrectly reordered when the operation on it is not
+ consistant with the one in reduction operation.
+
 2014-03-10  Jakub Jelinek  <jakub@redhat.com>

  PR ipa/60457
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 41b6875..414a745 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2014-03-28  Cong Hou  <congh@google.com>
+
+ PR tree-optimization/60656
+ * gcc.dg/vect/pr60656.c: New test.
+
 2014-03-10  Jakub Jelinek  <jakub@redhat.com>

  PR ipa/60457
diff --git a/gcc/testsuite/gcc.dg/vect/pr60656.c
b/gcc/testsuite/gcc.dg/vect/pr60656.c
new file mode 100644
index 0000000..ebaab62
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr60656.c
@@ -0,0 +1,45 @@ 
+/* { dg-require-effective-target vect_int } */
+
+#include "tree-vect.h"
+
+__attribute__ ((noinline)) long
+foo ()
+{
+  int v[] = {5000, 5001, 5002, 5003};
+  long s = 0;
+  int i;
+
+  for(i = 0; i < 4; ++i)
+    {
+      long P = v[i];
+      s += P*P*P;
+    }
+  return s;
+}
+
+long
+bar ()
+{
+  int v[] = {5000, 5001, 5002, 5003};
+  long s = 0;
+  int i;
+
+  for(i = 0; i < 4; ++i)
+    {
+      long P = v[i];
+      s += P*P*P;
+      __asm__ volatile ("");
+    }
+  return s;
+}
+
+int main()
+{
+  if (foo () != bar ())
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
+
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 70fb411..7442d0c 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -7827,7 +7827,16 @@  supportable_widening_operation (enum tree_code
code, gimple stmt,
      stmt, vectype_out, vectype_in,
      code1, code2, multi_step_cvt,
      interm_types))
- return true;
+        {
+          tree lhs = gimple_assign_lhs (stmt);
+          use_operand_p dummy;
+          gimple use_stmt;
+          stmt_vec_info use_stmt_info = NULL;
+          if (single_imm_use (lhs, &dummy, &use_stmt)
+              && (use_stmt_info = vinfo_for_stmt (use_stmt))
+              && STMT_VINFO_DEF_TYPE (use_stmt_info) == vect_reduction_def)
+            return true;
+        }
       c1 = VEC_WIDEN_MULT_LO_EXPR;
       c2 = VEC_WIDEN_MULT_HI_EXPR;