diff options
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr97255.cc | 44 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.c | 8 |
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) |