From: Alejandro Martinez Date: Mon, 3 Jun 2019 09:13:32 +0000 (+0000) Subject: Fix ICE in vect_slp_analyze_node_operations_1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=bcde3345ea97aef36f5b4e29f09f71bcd41879b2;p=gcc.git Fix ICE in vect_slp_analyze_node_operations_1 This patch fixes bug 90681. It was caused by trying to SLP vectorize a non groupped load. We've fixed it by tweaking a bit the implementation: mark masked loads as not vectorizable, but support them as an special case. Then the detect them in the test for normal non-groupped loads that was already there. From-SVN: r271856 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3b4ffa6bdb..cceed1af569 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2019-06-03 Alejandro Martinez + + 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 * cfg.c (debug): Use TDF_DETAILS for debug and diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c index 3051a7aa72d..04081f36c4d 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 74d7264a075..453e9c646c3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-06-03 Alejandro Martinez + + PR tree-optimization/90681 + * gfortran.dg/vect/pr90681.f: New test. + 2019-06-03 Richard Biener 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 00000000000..03d3987b146 --- /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 884db33c8ec..930cd79784e 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 (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 ())