From: Ilya Enkovich Date: Fri, 13 Nov 2015 06:50:18 +0000 (+0000) Subject: tree-vect-stmts.c (vectorizable_mask_load_store): Check types of stored value and... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=57e2f6ad9f1af35a539be51006a00436e34923f0;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8e472b02bf8..34afa9a9e8a 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 409020aaab9..60b50873dab 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 00000000000..c5f0458ea75 --- /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 cfe30e067ea..7870b29eab5 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;