diff options
author | Richard Biener <rguenther@suse.de> | 2024-11-18 13:46:52 +0100 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2024-11-18 18:57:21 +0100 |
commit | c108785c425b2042f63fa975c58c274d19a8d160 (patch) | |
tree | c7b0e89efcd73b2467f2701f365c16d29683cedd | |
parent | f5ceca96278b2ffaff838216aa6644fedb603573 (diff) | |
download | gcc-c108785c425b2042f63fa975c58c274d19a8d160.zip gcc-c108785c425b2042f63fa975c58c274d19a8d160.tar.gz gcc-c108785c425b2042f63fa975c58c274d19a8d160.tar.bz2 |
tree-optimization/117594 - fix live op vectorization for length masked case
The code was passing factor == 0 to vect_get_loop_len which always
returns an unmodified length, even if the number of scalar elements
doesn't agree. It also failed to insert the eventually generated
code.
PR tree-optimization/117594
* tree-vect-loop.cc (vectorizable_live_operation_1): Pass
factor == 1 to vect_get_loop_len, insert generated stmts.
* gcc.dg/vect/pr117594.c: New testcase.
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr117594.c | 20 | ||||
-rw-r--r-- | gcc/tree-vect-loop.cc | 3 |
2 files changed, 22 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr117594.c b/gcc/testsuite/gcc.dg/vect/pr117594.c new file mode 100644 index 0000000..ab21390 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr117594.c @@ -0,0 +1,20 @@ +/* { dg-require-effective-target int32plus } */ + +#include "tree-vect.h" + +unsigned a; +short b, d, e; +int main() +{ + check_vect (); + short h = d; + short *z = &h; + for (_Bool i = 0; i < 1; i = 1) + for (unsigned j = 0; j < (z[i] ?: 10); j += 3) + { + a -= 9; + b -= ~e; + } + if (a != 4294967260) + __builtin_abort (); +} diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc index 18c4fa1..ce72814 100644 --- a/gcc/tree-vect-loop.cc +++ b/gcc/tree-vect-loop.cc @@ -11221,7 +11221,8 @@ vectorizable_live_operation_1 (loop_vec_info loop_vinfo, gimple_stmt_iterator gsi = gsi_last (tem); tree len = vect_get_loop_len (loop_vinfo, &gsi, &LOOP_VINFO_LENS (loop_vinfo), - 1, vectype, 0, 0); + 1, vectype, 0, 1); + gimple_seq_add_seq (&stmts, tem); /* BIAS - 1. */ signed char biasval = LOOP_VINFO_PARTIAL_LOAD_STORE_BIAS (loop_vinfo); |