From: Richard Biener Date: Thu, 1 Oct 2020 07:29:32 +0000 (+0200) Subject: tree-optimization/97255 - missing vector bool pattern of SRAed bool X-Git-Tag: releases/gcc-10.3.0~786 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67baa11f68e72cf562c491a8107bcdf3f1d6fc9b;p=thirdparty%2Fgcc.git tree-optimization/97255 - missing vector bool pattern of SRAed bool 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. 2020-10-01 Richard Biener PR tree-optimization/97255 * tree-vect-patterns.c (vect_recog_bool_pattern): Also handle VIEW_CONVERT_EXPR. * g++.dg/vect/pr97255.cc: New testcase. --- diff --git a/gcc/testsuite/g++.dg/vect/pr97255.cc b/gcc/testsuite/g++.dg/vect/pr97255.cc new file mode 100644 index 000000000000..efb7f53fd278 --- /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 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 dd0c19dc5e50..ae5dc5c42260 100644 --- a/gcc/tree-vect-patterns.c +++ b/gcc/tree-vect-patterns.c @@ -4025,14 +4025,18 @@ vect_recog_bool_pattern (stmt_vec_info stmt_vinfo, tree *type_out) 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 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)