aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/internal-fn.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/vect/pr90681.f13
-rw-r--r--gcc/tree-vect-slp.c25
5 files changed, 42 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a3b4ffa..cceed1a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2019-06-03 Alejandro Martinez <alejandro.martinezvicente@arm.com>
+
+ PR tree-optimization/90681
+ * internal-fn.c (mask_load_direct): Mark as non-vectorizable again.
+ * tree-vect-slp.c (vect_build_slp_tree_1): Add masked loads as a
+ special case for SLP, but fail on non-groupped loads.
+
2019-06-03 Martin Liska <mliska@suse.cz>
* cfg.c (debug): Use TDF_DETAILS for debug and
diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index 3051a7a..04081f3 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -100,7 +100,7 @@ init_internal_fns ()
/* Create static initializers for the information returned by
direct_internal_fn. */
#define not_direct { -2, -2, false }
-#define mask_load_direct { -1, 2, true }
+#define mask_load_direct { -1, 2, false }
#define load_lanes_direct { -1, -1, false }
#define mask_load_lanes_direct { -1, -1, false }
#define gather_load_direct { -1, -1, false }
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 74d7264..453e9c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-06-03 Alejandro Martinez <alejandro.martinezvicente@arm.com>
+
+ PR tree-optimization/90681
+ * gfortran.dg/vect/pr90681.f: New test.
+
2019-06-03 Richard Biener <rguenther@suse.de>
PR testsuite/90713
diff --git a/gcc/testsuite/gfortran.dg/vect/pr90681.f b/gcc/testsuite/gfortran.dg/vect/pr90681.f
new file mode 100644
index 0000000..03d3987
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/vect/pr90681.f
@@ -0,0 +1,13 @@
+C { dg-do compile }
+C { dg-additional-options "-march=armv8.2-a+sve" { target { aarch64*-*-* } } }
+ SUBROUTINE HMU (H1)
+ COMMON DD(107)
+ DIMENSION H1(NORBS,*)
+ DO 70 J1 = IA,I1
+ H1(I1,J1) = 0
+ JO1 = J1
+ IF (JO1.EQ.1) THEN
+ H1(I1,J1) = DD(NI)
+ END IF
+ 70 CONTINUE
+ END
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 884db33..930cd797 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -661,6 +661,7 @@ vect_build_slp_tree_1 (unsigned char *swap,
machine_mode optab_op2_mode;
machine_mode vec_mode;
stmt_vec_info first_load = NULL, prev_first_load = NULL;
+ bool load_p = false;
/* For every stmt in NODE find its def stmt/s. */
stmt_vec_info stmt_info;
@@ -714,13 +715,16 @@ vect_build_slp_tree_1 (unsigned char *swap,
if (gcall *call_stmt = dyn_cast <gcall *> (stmt))
{
rhs_code = CALL_EXPR;
- if ((gimple_call_internal_p (call_stmt)
- && (!vectorizable_internal_fn_p
- (gimple_call_internal_fn (call_stmt))))
- || gimple_call_tail_p (call_stmt)
- || gimple_call_noreturn_p (call_stmt)
- || !gimple_call_nothrow_p (call_stmt)
- || gimple_call_chain (call_stmt))
+
+ if (gimple_call_internal_p (stmt, IFN_MASK_LOAD))
+ load_p = true;
+ else if ((gimple_call_internal_p (call_stmt)
+ && (!vectorizable_internal_fn_p
+ (gimple_call_internal_fn (call_stmt))))
+ || gimple_call_tail_p (call_stmt)
+ || gimple_call_noreturn_p (call_stmt)
+ || !gimple_call_nothrow_p (call_stmt)
+ || gimple_call_chain (call_stmt))
{
if (dump_enabled_p ())
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -732,7 +736,10 @@ vect_build_slp_tree_1 (unsigned char *swap,
}
}
else
- rhs_code = gimple_assign_rhs_code (stmt);
+ {
+ rhs_code = gimple_assign_rhs_code (stmt);
+ load_p = TREE_CODE_CLASS (rhs_code) == tcc_reference;
+ }
/* Check the operation. */
if (i == 0)
@@ -899,7 +906,7 @@ vect_build_slp_tree_1 (unsigned char *swap,
} /* Grouped access. */
else
{
- if (TREE_CODE_CLASS (rhs_code) == tcc_reference)
+ if (load_p)
{
/* Not grouped load. */
if (dump_enabled_p ())