diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-12-10 12:20:07 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-12-10 12:20:07 +0000 |
commit | f1c13d6ddeecc9da5f53643b6b6b715546d670fe (patch) | |
tree | 692bc76eee86aeddb222ae16fbb0b8239944aea3 /gcc | |
parent | 9ec35478ccf0f3539988a054b7996278706a7710 (diff) | |
download | gcc-f1c13d6ddeecc9da5f53643b6b6b715546d670fe.zip gcc-f1c13d6ddeecc9da5f53643b6b6b715546d670fe.tar.gz gcc-f1c13d6ddeecc9da5f53643b6b6b715546d670fe.tar.bz2 |
Record the loop masks needed for EXTRACT_LAST_REDUCTIONs
The analysis phase of vectorizable_condition wasn't recording the
loop masks needed by the transform phase. This meant that the masks
wouldn't be created in the (rare) case that no other statement needed
them.
2019-12-10 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-vect-stmts.c (vectorizable_condition): Record the loop
masks required for extract-last reductions.
gcc/testsuite/
* gcc.target/aarch64/sve/clastb_9.c: New test.
From-SVN: r279163
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c | 21 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 17 |
4 files changed, 45 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c1501e..0ca3e15 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2019-12-10 Richard Sandiford <richard.sandiford@arm.com> + * tree-vect-stmts.c (vectorizable_condition): Record the loop + masks required for extract-last reductions. + +2019-12-10 Richard Sandiford <richard.sandiford@arm.com> + * tree-vect-stmts.c (vect_finish_replace_stmt): Always use the original scalar statement rather than a pattern statement. (vectorizable_condition): Likewise, in the handling of extract-last diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b43497c..5020620 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-12-10 Richard Sandiford <richard.sandiford@arm.com> + + * gcc.target/aarch64/sve/clastb_9.c: New test. + 2019-12-10 Tobias Burnus <tobias@codesourcery.com> PR fortran/92872 diff --git a/gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c b/gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c new file mode 100644 index 0000000..e9db935 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/clastb_9.c @@ -0,0 +1,21 @@ +/* Originally gcc.dg/vect/O1-pr41008.c. */ +/* { dg-options "-O1 -ftree-vectorize -fno-vect-cost-model -msve-vector-bits=256" } */ + +double heating[2][2]; + +void foo (int, int); + +void map_do() +{ + int jsav, ksav, k, j; + + for(k = 0; k < 2; k++) + for(j = 0; j < 2; j++) + if (heating[k][j] > 0.) + { + jsav = j; + ksav = k; + } + + foo (jsav, ksav); +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 08ffb72..706da5b 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -9912,6 +9912,7 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, vect_unknown_def_type, vect_unknown_def_type}; int ndts = 4; int ncopies; + int vec_num; enum tree_code code, cond_code, bitop1 = NOP_EXPR, bitop2 = NOP_EXPR; stmt_vec_info prev_stmt_info = NULL; int i, j; @@ -9969,9 +9970,15 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, tree vectype1 = NULL_TREE, vectype2 = NULL_TREE; if (slp_node) - ncopies = 1; + { + ncopies = 1; + vec_num = SLP_TREE_NUMBER_OF_VEC_STMTS (slp_node); + } else - ncopies = vect_get_num_copies (loop_vinfo, vectype); + { + ncopies = vect_get_num_copies (loop_vinfo, vectype); + vec_num = 1; + } gcc_assert (ncopies >= 1); if (for_reduction && ncopies > 1) @@ -10094,6 +10101,12 @@ vectorizable_condition (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, } } + if (loop_vinfo + && LOOP_VINFO_CAN_FULLY_MASK_P (loop_vinfo) + && reduction_type == EXTRACT_LAST_REDUCTION) + vect_record_loop_mask (loop_vinfo, &LOOP_VINFO_MASKS (loop_vinfo), + ncopies * vec_num, vectype, NULL); + vect_cost_for_stmt kind = vector_stmt; if (reduction_type == EXTRACT_LAST_REDUCTION) /* Count one reduction-like operation per vector. */ |