[PATCH] Fix vectorizer bool pattern matching with -fnon-call-exceptions (PR tree-optimization/52046)

2012-01-30 Thread Jakub Jelinek
Hi!

If a comparison can throw, it won't be a valid condition for
COND_EXPR or VEC_COND_EXPR, because is_gimple_condexpr will
fail.  This patch gives up in that case.  Bootstrapped/regtested on
x86_64-linux and i686-linux, ok for trunk?

2012-01-30  Jakub Jelinek  ja...@redhat.com

PR tree-optimization/52046
* tree-vect-patterns.c (check_bool_pattern): Give up if
a comparison could throw.

* gcc.dg/pr52046.c: New test.

--- gcc/tree-vect-patterns.c.jj 2012-01-13 21:47:35.0 +0100
+++ gcc/tree-vect-patterns.c2012-01-30 10:58:11.048787682 +0100
@@ -1,5 +1,5 @@
 /* Analysis Utilities for Loop Vectorization.
-   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
+   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012
Free Software Foundation, Inc.
Contributed by Dorit Nuzman do...@il.ibm.com
 
@@ -1967,6 +1967,11 @@ check_bool_pattern (tree var, loop_vec_i
{
  tree vecitype, comp_vectype;
 
+ /* If the comparison can throw, then is_gimple_condexpr will be
+false and we can't make a COND_EXPR/VEC_COND_EXPR out of it.  */
+ if (stmt_could_throw_p (def_stmt))
+   return false;
+
  comp_vectype = get_vectype_for_scalar_type (TREE_TYPE (rhs1));
  if (comp_vectype == NULL_TREE)
return false;
--- gcc/testsuite/gcc.dg/pr52046.c.jj   2012-01-30 10:59:42.749264286 +0100
+++ gcc/testsuite/gcc.dg/pr52046.c  2012-01-30 10:59:28.0 +0100
@@ -0,0 +1,14 @@
+/* PR tree-optimization/52046 */
+/* { dg-do compile } */
+/* { dg-options -O3 -fexceptions -fnon-call-exceptions } */
+
+extern float a[], b[], c[], d[];
+extern int k[];
+
+void
+foo (void)
+{
+  int i;
+  for (i = 0; i  1024; ++i)
+k[i] = (a[i]  b[i]) | (c[i]  d[i]);
+}

Jakub


Re: [PATCH] Fix vectorizer bool pattern matching with -fnon-call-exceptions (PR tree-optimization/52046)

2012-01-30 Thread Richard Guenther
On Mon, Jan 30, 2012 at 2:37 PM, Jakub Jelinek ja...@redhat.com wrote:
 Hi!

 If a comparison can throw, it won't be a valid condition for
 COND_EXPR or VEC_COND_EXPR, because is_gimple_condexpr will
 fail.  This patch gives up in that case.  Bootstrapped/regtested on
 x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

 2012-01-30  Jakub Jelinek  ja...@redhat.com

        PR tree-optimization/52046
        * tree-vect-patterns.c (check_bool_pattern): Give up if
        a comparison could throw.

        * gcc.dg/pr52046.c: New test.

 --- gcc/tree-vect-patterns.c.jj 2012-01-13 21:47:35.0 +0100
 +++ gcc/tree-vect-patterns.c    2012-01-30 10:58:11.048787682 +0100
 @@ -1,5 +1,5 @@
  /* Analysis Utilities for Loop Vectorization.
 -   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011
 +   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.
    Contributed by Dorit Nuzman do...@il.ibm.com

 @@ -1967,6 +1967,11 @@ check_bool_pattern (tree var, loop_vec_i
        {
          tree vecitype, comp_vectype;

 +         /* If the comparison can throw, then is_gimple_condexpr will be
 +            false and we can't make a COND_EXPR/VEC_COND_EXPR out of it.  */
 +         if (stmt_could_throw_p (def_stmt))
 +           return false;
 +
          comp_vectype = get_vectype_for_scalar_type (TREE_TYPE (rhs1));
          if (comp_vectype == NULL_TREE)
            return false;
 --- gcc/testsuite/gcc.dg/pr52046.c.jj   2012-01-30 10:59:42.749264286 +0100
 +++ gcc/testsuite/gcc.dg/pr52046.c      2012-01-30 10:59:28.0 +0100
 @@ -0,0 +1,14 @@
 +/* PR tree-optimization/52046 */
 +/* { dg-do compile } */
 +/* { dg-options -O3 -fexceptions -fnon-call-exceptions } */
 +
 +extern float a[], b[], c[], d[];
 +extern int k[];
 +
 +void
 +foo (void)
 +{
 +  int i;
 +  for (i = 0; i  1024; ++i)
 +    k[i] = (a[i]  b[i]) | (c[i]  d[i]);
 +}

        Jakub