diff mbox

Fix up vectorization of multiplication with bool cast to integer (PR tree-optimization/69820)

Message ID 20160216103830.GP3017@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Feb. 16, 2016, 10:38 a.m. UTC
On Tue, Feb 16, 2016 at 11:06:53AM +0100, Richard Biener wrote:
> Hmm, I think it works in general, but I suspect that the pattern has
> to use the original def but for out analysis we have to look at the
> pattern.
> 
> So another fix would be to simply fail if there was a pattern detected.

That seems to work, sure.  So is that ok if it passes bootstrap/regtest?

2016-02-15  Jakub Jelinek  <jakub@redhat.com>
	    Richard Biener  <rguenther@suse.de>

	PR tree-optimization/69820
	* tree-vect-patterns.c (type_conversion_p): Return false if
	*orig_type is unsigned single precision or boolean.
	(vect_recog_dot_prod_pattern, vect_recog_widen_mult_pattern):
	Formatting fix.

	* gcc.dg/vect/pr69820.c: New test.


	Jakub

Comments

Richard Biener Feb. 16, 2016, 10:50 a.m. UTC | #1
On Tue, 16 Feb 2016, Jakub Jelinek wrote:

> On Tue, Feb 16, 2016 at 11:06:53AM +0100, Richard Biener wrote:
> > Hmm, I think it works in general, but I suspect that the pattern has
> > to use the original def but for out analysis we have to look at the
> > pattern.
> > 
> > So another fix would be to simply fail if there was a pattern detected.
> 
> That seems to work, sure.  So is that ok if it passes bootstrap/regtest?

Ok.

Thanks,
Richard.

> 2016-02-15  Jakub Jelinek  <jakub@redhat.com>
> 	    Richard Biener  <rguenther@suse.de>
> 
> 	PR tree-optimization/69820
> 	* tree-vect-patterns.c (type_conversion_p): Return false if
> 	*orig_type is unsigned single precision or boolean.
> 	(vect_recog_dot_prod_pattern, vect_recog_widen_mult_pattern):
> 	Formatting fix.
> 
> 	* gcc.dg/vect/pr69820.c: New test.
> 
> --- gcc/tree-vect-patterns.c.jj	2016-02-15 22:22:45.958677390 +0100
> +++ gcc/tree-vect-patterns.c	2016-02-16 11:12:20.982147520 +0100
> @@ -171,6 +171,13 @@ type_conversion_p (tree name, gimple *us
>    if (!*def_stmt)
>      return false;
>  
> +  if (dt == vect_internal_def)
> +    {
> +      stmt_vec_info def_vinfo = vinfo_for_stmt (*def_stmt);
> +      if (STMT_VINFO_IN_PATTERN_P (def_vinfo))
> +	return false;
> +    }
> +
>    if (!is_gimple_assign (*def_stmt))
>      return false;
>  
> @@ -334,8 +341,8 @@ vect_recog_dot_prod_pattern (vec<gimple
>        stmt = last_stmt;
>  
>        if (type_conversion_p (oprnd0, stmt, true, &half_type, &def_stmt,
> -                               &promotion)
> -         && promotion)
> +			     &promotion)
> +	  && promotion)
>          {
>            stmt = def_stmt;
>            oprnd0 = gimple_assign_rhs1 (stmt);
> @@ -395,13 +402,13 @@ vect_recog_dot_prod_pattern (vec<gimple
>            || !types_compatible_p (TREE_TYPE (oprnd1), prod_type))
>          return NULL;
>        if (!type_conversion_p (oprnd0, stmt, true, &half_type0, &def_stmt,
> -                                &promotion)
> -          || !promotion)
> +			      &promotion)
> +	  || !promotion)
>          return NULL;
>        oprnd00 = gimple_assign_rhs1 (def_stmt);
>        if (!type_conversion_p (oprnd1, stmt, true, &half_type1, &def_stmt,
> -                                &promotion)
> -          || !promotion)
> +			      &promotion)
> +	  || !promotion)
>          return NULL;
>        oprnd01 = gimple_assign_rhs1 (def_stmt);
>        if (!types_compatible_p (half_type0, half_type1))
> @@ -891,10 +898,10 @@ vect_recog_widen_mult_pattern (vec<gimpl
>  	  oprnd = &oprnd1;
>  	}
>  
> -        tree old_oprnd = gimple_assign_rhs1 (def_stmt);
> -	tree new_oprnd = make_ssa_name (half_type0);
> -	new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd);
> -        *oprnd = new_oprnd;
> +      tree old_oprnd = gimple_assign_rhs1 (def_stmt);
> +      tree new_oprnd = make_ssa_name (half_type0);
> +      new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd);
> +      *oprnd = new_oprnd;
>      }
>  
>    /* Handle unsigned case.  Look for
> --- gcc/testsuite/gcc.dg/vect/pr69820.c.jj	2016-02-16 10:21:40.155236476 +0100
> +++ gcc/testsuite/gcc.dg/vect/pr69820.c	2016-02-16 10:21:40.155236476 +0100
> @@ -0,0 +1,35 @@
> +/* PR tree-optimization/69820 */
> +
> +#include "tree-vect.h"
> +
> +unsigned int a[100];
> +long long int b[100];
> +unsigned short c[100];
> +
> +__attribute__((noinline, noclone)) void
> +foo (void)
> +{
> +  int i;
> +  for (i = 0; i < 100; ++i)
> +    b[i] = a[i] * (c[i] * (_Bool) c[i]);
> +}
> +
> +int
> +main ()
> +{
> +  int i;
> +  if (__SIZEOF_INT__ * __CHAR_BIT__ != 32)
> +    return 0;
> +  check_vect ();
> +  for (i = 0; i < 100; ++i)
> +    {
> +      a[i] = 3489456818U;
> +      b[i] = 0x1eadbeefbeefdeadLL;
> +      c[i] = 38364;
> +    }
> +  foo ();
> +  for (i = 0; i < 100; ++i)
> +    if (b[i] != 0xed446af8U)
> +      __builtin_abort ();
> +  return 0;
> +}
> 
> 	Jakub
> 
>
diff mbox

Patch

--- gcc/tree-vect-patterns.c.jj	2016-02-15 22:22:45.958677390 +0100
+++ gcc/tree-vect-patterns.c	2016-02-16 11:12:20.982147520 +0100
@@ -171,6 +171,13 @@  type_conversion_p (tree name, gimple *us
   if (!*def_stmt)
     return false;
 
+  if (dt == vect_internal_def)
+    {
+      stmt_vec_info def_vinfo = vinfo_for_stmt (*def_stmt);
+      if (STMT_VINFO_IN_PATTERN_P (def_vinfo))
+	return false;
+    }
+
   if (!is_gimple_assign (*def_stmt))
     return false;
 
@@ -334,8 +341,8 @@  vect_recog_dot_prod_pattern (vec<gimple
       stmt = last_stmt;
 
       if (type_conversion_p (oprnd0, stmt, true, &half_type, &def_stmt,
-                               &promotion)
-         && promotion)
+			     &promotion)
+	  && promotion)
         {
           stmt = def_stmt;
           oprnd0 = gimple_assign_rhs1 (stmt);
@@ -395,13 +402,13 @@  vect_recog_dot_prod_pattern (vec<gimple
           || !types_compatible_p (TREE_TYPE (oprnd1), prod_type))
         return NULL;
       if (!type_conversion_p (oprnd0, stmt, true, &half_type0, &def_stmt,
-                                &promotion)
-          || !promotion)
+			      &promotion)
+	  || !promotion)
         return NULL;
       oprnd00 = gimple_assign_rhs1 (def_stmt);
       if (!type_conversion_p (oprnd1, stmt, true, &half_type1, &def_stmt,
-                                &promotion)
-          || !promotion)
+			      &promotion)
+	  || !promotion)
         return NULL;
       oprnd01 = gimple_assign_rhs1 (def_stmt);
       if (!types_compatible_p (half_type0, half_type1))
@@ -891,10 +898,10 @@  vect_recog_widen_mult_pattern (vec<gimpl
 	  oprnd = &oprnd1;
 	}
 
-        tree old_oprnd = gimple_assign_rhs1 (def_stmt);
-	tree new_oprnd = make_ssa_name (half_type0);
-	new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd);
-        *oprnd = new_oprnd;
+      tree old_oprnd = gimple_assign_rhs1 (def_stmt);
+      tree new_oprnd = make_ssa_name (half_type0);
+      new_stmt = gimple_build_assign (new_oprnd, NOP_EXPR, old_oprnd);
+      *oprnd = new_oprnd;
     }
 
   /* Handle unsigned case.  Look for
--- gcc/testsuite/gcc.dg/vect/pr69820.c.jj	2016-02-16 10:21:40.155236476 +0100
+++ gcc/testsuite/gcc.dg/vect/pr69820.c	2016-02-16 10:21:40.155236476 +0100
@@ -0,0 +1,35 @@ 
+/* PR tree-optimization/69820 */
+
+#include "tree-vect.h"
+
+unsigned int a[100];
+long long int b[100];
+unsigned short c[100];
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+  int i;
+  for (i = 0; i < 100; ++i)
+    b[i] = a[i] * (c[i] * (_Bool) c[i]);
+}
+
+int
+main ()
+{
+  int i;
+  if (__SIZEOF_INT__ * __CHAR_BIT__ != 32)
+    return 0;
+  check_vect ();
+  for (i = 0; i < 100; ++i)
+    {
+      a[i] = 3489456818U;
+      b[i] = 0x1eadbeefbeefdeadLL;
+      c[i] = 38364;
+    }
+  foo ();
+  for (i = 0; i < 100; ++i)
+    if (b[i] != 0xed446af8U)
+      __builtin_abort ();
+  return 0;
+}