aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/g++.dg/vect/pr97255.cc44
-rw-r--r--gcc/tree-vect-patterns.c8
2 files changed, 50 insertions, 2 deletions
diff --git a/gcc/testsuite/g++.dg/vect/pr97255.cc b/gcc/testsuite/g++.dg/vect/pr97255.cc
new file mode 100644
index 0000000..efb7f53
--- /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 db45740..d626c5f 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)