aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-09-18 15:32:01 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-09-18 15:32:01 +0000
commit7251b0bfbf09fae831bb5d3d2d7a311e9d37b398 (patch)
tree9379eaf16d2d7e38dd329db4ae50c0e17c96aa3a /gcc
parente009b0558e8dd9bd9b17308104834ef5a1536975 (diff)
downloadgcc-7251b0bfbf09fae831bb5d3d2d7a311e9d37b398.zip
gcc-7251b0bfbf09fae831bb5d3d2d7a311e9d37b398.tar.gz
gcc-7251b0bfbf09fae831bb5d3d2d7a311e9d37b398.tar.bz2
Fix vectorizable_mask_load_store handling of invariant masks
vectorizable_mask_load_store was not passing the required mask type to vect_get_vec_def_for_operand. This doesn't matter for masks that are defined in the loop, since their STMT_VINFO_VECTYPE will be what we need anyway. But it's not possible to tell which mask type the caller needs when looking at an invariant scalar boolean. As the comment above the function says: In case OP is an invariant or constant, a new stmt that creates a vector def needs to be introduced. VECTYPE may be used to specify a required type for vector invariant. This fixes the attached testcase for SVE. 2017-09-18 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * tree-vect-stmts.c (vectorizable_mask_load_store): Pass mask_vectype to vect_get_vec_def_for_operand when getting the mask operand. gcc/testsuite/ * gfortran.dg/vect/mask-store-1.f90: New test. From-SVN: r252932
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gfortran.dg/vect/mask-store-1.f9011
-rw-r--r--gcc/tree-vect-stmts.c6
4 files changed, 24 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9142af1..70b7350 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,9 @@
2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * tree-vect-stmts.c (vectorizable_mask_load_store): Pass mask_vectype
+ to vect_get_vec_def_for_operand when getting the mask operand.
+
+2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f2ad8a0..a466284 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * gfortran.dg/vect/mask-store-1.f90: New test.
+
2017-09-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/45033
diff --git a/gcc/testsuite/gfortran.dg/vect/mask-store-1.f90 b/gcc/testsuite/gfortran.dg/vect/mask-store-1.f90
new file mode 100644
index 0000000..83cd8dd
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/mask-store-1.f90
@@ -0,0 +1,11 @@
+subroutine foo(a, b, x, n)
+ real(kind=8) :: a(n), b(n), tmp
+ logical(kind=1) :: x
+ integer(kind=4) :: i, n
+ do i = 1, n
+ if (x) then
+ a(i) = b(i)
+ end if
+ b(i) = b(i) + 10
+ end do
+end subroutine
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 852e5cd..8f0d3d0 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2331,7 +2331,8 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
{
tree rhs = gimple_call_arg (stmt, 3);
vec_rhs = vect_get_vec_def_for_operand (rhs, stmt);
- vec_mask = vect_get_vec_def_for_operand (mask, stmt);
+ vec_mask = vect_get_vec_def_for_operand (mask, stmt,
+ mask_vectype);
/* We should have catched mismatched types earlier. */
gcc_assert (useless_type_conversion_p (vectype,
TREE_TYPE (vec_rhs)));
@@ -2388,7 +2389,8 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
if (i == 0)
{
- vec_mask = vect_get_vec_def_for_operand (mask, stmt);
+ vec_mask = vect_get_vec_def_for_operand (mask, stmt,
+ mask_vectype);
dataref_ptr = vect_create_data_ref_ptr (stmt, vectype, NULL,
NULL_TREE, &dummy, gsi,
&ptr_incr, false, &inv_p);