diff options
author | Richard Biener <rguenther@suse.de> | 2020-09-09 12:05:55 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-09-09 13:12:27 +0200 |
commit | db918db2c305adf8ba727a5981a684c19de1510e (patch) | |
tree | 6d190ab13a33e107aec4966aa9eec1a5f54a6cd1 | |
parent | cbc12c582462c720adccef5097b3162cc77c37a2 (diff) | |
download | gcc-db918db2c305adf8ba727a5981a684c19de1510e.zip gcc-db918db2c305adf8ba727a5981a684c19de1510e.tar.gz gcc-db918db2c305adf8ba727a5981a684c19de1510e.tar.bz2 |
enable live comparison vectorization
This removes a check preventing vectorization of live results of
vectorized comparisons. I tested it with AVX512 mask registers
(inspecting assembly) and traditional vector masks.
2020-09-09 Richard Biener <rguenther@suse.de>
* tree-vect-stmts.c (vectorizable_comparison): Allow
STMT_VINFO_LIVE_P stmts.
* gcc.dg/vect/vect-live-6.c: New testcase.
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-live-6.c | 31 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 8 |
2 files changed, 31 insertions, 8 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/vect-live-6.c b/gcc/testsuite/gcc.dg/vect/vect-live-6.c new file mode 100644 index 0000000..c986c97 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-live-6.c @@ -0,0 +1,31 @@ +#include "tree-vect.h" + +int a[1024]; +int b[1024]; + +_Bool +fn1 () +{ + _Bool tem; + for (int i = 0; i < 1024; ++i) + { + tem = !a[i]; + b[i] = tem; + } + return tem; +} + +int main() +{ + check_vect (); + for (int i = 0; i < 1024; ++i) + { + a[i] = i & 5; + __asm__ volatile ("" ::: "memory"); + } + if (fn1 () != !(1023 & 5) || b[2] != 1) + abort (); + return 0; +} + +/* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { target vect_int } } } */ diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index e069f87..191957c 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -10319,14 +10319,6 @@ vectorizable_comparison (vec_info *vinfo, if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_internal_def) return false; - if (loop_vinfo && STMT_VINFO_LIVE_P (stmt_info)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "value used after loop.\n"); - return false; - } - gassign *stmt = dyn_cast <gassign *> (stmt_info->stmt); if (!stmt) return false; |