diff options
author | Ilya Enkovich <enkovich.gnu@gmail.com> | 2015-11-13 06:50:18 +0000 |
---|---|---|
committer | Ilya Enkovich <ienkovich@gcc.gnu.org> | 2015-11-13 06:50:18 +0000 |
commit | 57e2f6ad9f1af35a539be51006a00436e34923f0 (patch) | |
tree | 28ebc516cd400d8a9ca476cb9e644a7600b1bcb3 /gcc | |
parent | 54985c70aa21fe6cf49f2d109a6bd51f0a4c964f (diff) | |
download | gcc-57e2f6ad9f1af35a539be51006a00436e34923f0.zip gcc-57e2f6ad9f1af35a539be51006a00436e34923f0.tar.gz gcc-57e2f6ad9f1af35a539be51006a00436e34923f0.tar.bz2 |
tree-vect-stmts.c (vectorizable_mask_load_store): Check types of stored value and storage are compatible.
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.
From-SVN: r230289
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/simd-mask-store-bool.cc | 18 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 19 |
4 files changed, 38 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e472b0..34afa9a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-11-13 Ilya Enkovich <enkovich.gnu@gmail.com> + + * tree-vect-stmts.c (vectorizable_mask_load_store): Check + types of stored value and storage are compatible. + 2015-11-13 Andris Pavenis <andris.pavenis@iki.fi> * gcc.c (POST_LINK_SPEC): Define if not already defined. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 409020a..60b5087 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-11-13 Ilya Enkovich <enkovich.gnu@gmail.com> + + * g++.dg/vect/simd-mask-store-bool.cc: New test. + 2015-11-13 David Malcolm <dmalcolm@redhat.com> 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 0000000..c5f0458 --- /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 cfe30e0..7870b29 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; |