diff mbox series

tree-optimization/97255 - missing vector bool pattern of SRAed bool

Message ID nycvar.YFH.7.76.2010011020470.7804@elmra.sevgm.obk
State New
Headers show
Series tree-optimization/97255 - missing vector bool pattern of SRAed bool | expand

Commit Message

Richard Biener Oct. 1, 2020, 8:21 a.m. UTC
SRA tends to use VIEW_CONVERT_EXPR when replacing bool fields with
unsigned char fields.  Those are not handled in vector bool pattern
detection causing vector true values to leak.  The following fixes
this by turning those into b ? 1 : 0 as well.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed to trunk.

2020-10-01  Richard Biener  <rguenther@suse.de>

	* tree-vect-patterns.c (vect_recog_bool_pattern): Also handle
	VIEW_CONVERT_EXPR.

	* g++.dg/vect/pr97255.cc: New testcase.
---
 gcc/testsuite/g++.dg/vect/pr97255.cc | 44 ++++++++++++++++++++++++++++
 gcc/tree-vect-patterns.c             |  8 +++--
 2 files changed, 50 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/vect/pr97255.cc
diff mbox series

Patch

diff --git a/gcc/testsuite/g++.dg/vect/pr97255.cc b/gcc/testsuite/g++.dg/vect/pr97255.cc
new file mode 100644
index 00000000000..efb7f53fd27
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr97255.cc
@@ -0,0 +1,44 @@ 
+// { dg-require-effective-target c++11 }
+// { dg-additional-options "-O3" }
+
+template<class T, unsigned N>
+class Array{
+public:
+    T& operator[](unsigned x) {return m_arr[x];}
+private:
+    T m_arr[N];
+};
+
+int
+__attribute__((noipa))
+logicalOr(Array< char, 4 > in1[60],
+          Array< bool, 4 > out[60])
+{
+  for (unsigned k0 = 0u; k0 < 60u; ++k0) {
+      Array< char, 4 > in1m = in1[k0];
+      Array< bool, 4 > x;
+      for (unsigned k1 = 0u; k1 < 4u; ++k1) {
+          char in1s = in1m[k1];
+          x[k1] = in1s != char(0) || in1s != char(0);
+      }
+      out[k0] = x;
+  }
+  return out[0][0];
+}
+
+
+int main()
+{
+  Array< char, 4 > In1[60]{};
+  Array< bool, 4 > Out7[60]{};
+
+  for( int i = 0; i < 60; ++i){
+      for( int j = 0; j < 4; ++j){
+          In1[i][j] = 240 - i*4 - j;
+      }
+  }
+
+  if (logicalOr(In1, Out7) != 1)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index db45740da3c..d626c5f7362 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -4028,14 +4028,18 @@  vect_recog_bool_pattern (vec_info *vinfo,
 
   var = gimple_assign_rhs1 (last_stmt);
   lhs = gimple_assign_lhs (last_stmt);
+  rhs_code = gimple_assign_rhs_code (last_stmt);
+
+  if (rhs_code == VIEW_CONVERT_EXPR)
+    var = TREE_OPERAND (var, 0);
 
   if (!VECT_SCALAR_BOOLEAN_TYPE_P (TREE_TYPE (var)))
     return NULL;
 
   hash_set<gimple *> bool_stmts;
 
-  rhs_code = gimple_assign_rhs_code (last_stmt);
-  if (CONVERT_EXPR_CODE_P (rhs_code))
+  if (CONVERT_EXPR_CODE_P (rhs_code)
+      || rhs_code == VIEW_CONVERT_EXPR)
     {
       if (! INTEGRAL_TYPE_P (TREE_TYPE (lhs))
 	  || TYPE_PRECISION (TREE_TYPE (lhs)) == 1)