aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-11-18 13:46:52 +0100
committerRichard Biener <rguenth@gcc.gnu.org>2024-11-18 18:57:21 +0100
commitc108785c425b2042f63fa975c58c274d19a8d160 (patch)
treec7b0e89efcd73b2467f2701f365c16d29683cedd
parentf5ceca96278b2ffaff838216aa6644fedb603573 (diff)
downloadgcc-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.c20
-rw-r--r--gcc/tree-vect-loop.cc3
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);