From: ienkovich Date: Fri, 13 Nov 2015 06:50:18 +0000 (+0000) Subject: gcc/ X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f5fe8cdc5b1c715b92bbce0e0153729e2a1f9749;p=thirdparty%2Fgcc.git gcc/ * tree-vect-stmts.c (vectorizable_mask_load_store): Check types of stored value and storage are compatible. gcc/testsuite/ * g++.dg/vect/simd-mask-store-bool.cc: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230289 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e472b02bf8a..34afa9a9e8a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-11-13 Ilya Enkovich + + * tree-vect-stmts.c (vectorizable_mask_load_store): Check + types of stored value and storage are compatible. + 2015-11-13 Andris Pavenis * gcc.c (POST_LINK_SPEC): Define if not already defined. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 409020aaab9f..60b50873dab5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-11-13 Ilya Enkovich + + * g++.dg/vect/simd-mask-store-bool.cc: New test. + 2015-11-13 David Malcolm PR driver/67613 diff --git a/gcc/testsuite/g++.dg/vect/simd-mask-store-bool.cc b/gcc/testsuite/g++.dg/vect/simd-mask-store-bool.cc new file mode 100644 index 000000000000..c5f0458ea752 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/simd-mask-store-bool.cc @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target vect_condition } */ +/* { dg-additional-options "-mavx512bw" { target { i?86-*-* x86_64-*-* } } } */ + +#define N 1024 + +int a[N], b[N], c[N]; +bool d[N]; + +void +test (void) +{ + int i; +#pragma omp simd safelen(64) + for (i = 0; i < N; i++) + if (a[i] > 0) + d[i] = b[i] > c[i]; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index cfe30e067ea7..7870b29eab55 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1688,6 +1688,7 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi, bool nested_in_vect_loop = nested_in_vect_loop_p (loop, stmt); struct data_reference *dr = STMT_VINFO_DATA_REF (stmt_info); tree vectype = STMT_VINFO_VECTYPE (stmt_info); + tree rhs_vectype = NULL_TREE; tree mask_vectype; tree elem_type; gimple *new_stmt; @@ -1757,6 +1758,13 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi, if (!mask_vectype) return false; + if (is_store) + { + tree rhs = gimple_call_arg (stmt, 3); + if (!vect_is_simple_use (rhs, loop_vinfo, &def_stmt, &dt, &rhs_vectype)) + return false; + } + if (STMT_VINFO_GATHER_SCATTER_P (stmt_info)) { gimple *def_stmt; @@ -1790,16 +1798,11 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi, else if (!VECTOR_MODE_P (TYPE_MODE (vectype)) || !can_vec_mask_load_store_p (TYPE_MODE (vectype), TYPE_MODE (mask_vectype), - !is_store)) + !is_store) + || (rhs_vectype + && !useless_type_conversion_p (vectype, rhs_vectype))) return false; - if (is_store) - { - tree rhs = gimple_call_arg (stmt, 3); - if (!vect_is_simple_use (rhs, loop_vinfo, &def_stmt, &dt)) - return false; - } - if (!vec_stmt) /* transformation not required. */ { STMT_VINFO_TYPE (stmt_info) = call_vec_info_type;