aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-09-06 14:05:43 +0100
committerTamar Christina <tamar.christina@arm.com>2024-09-06 14:05:43 +0100
commit2c4438d39156493b5b382eb48b1f884ca5ab7ed4 (patch)
tree82c25d3666eabbe40b1a3b25b29fb1e9340bb5df /gcc
parent1247fa6e95cdf4a6422ec802f733f1f7ecaa3557 (diff)
downloadgcc-2c4438d39156493b5b382eb48b1f884ca5ab7ed4.zip
gcc-2c4438d39156493b5b382eb48b1f884ca5ab7ed4.tar.gz
gcc-2c4438d39156493b5b382eb48b1f884ca5ab7ed4.tar.bz2
middle-end: check that the lhs of a COND_EXPR is an SSA_NAME in cond_store recognition [PR116628]
Because the vect_recog_bool_pattern can at the moment still transition out of GIMPLE and back into GENERIC the vect_recog_cond_store_pattern can end up using an expression as a mask rather than an SSA_NAME. This adds an explicit check that we have a mask and not an expression. gcc/ChangeLog: PR tree-optimization/116628 * tree-vect-patterns.cc (vect_recog_cond_store_pattern): Add SSA_NAME check on expression. gcc/testsuite/ChangeLog: PR tree-optimization/116628 * gcc.dg/vect/pr116628.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr116628.c14
-rw-r--r--gcc/tree-vect-patterns.cc3
2 files changed, 17 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/pr116628.c b/gcc/testsuite/gcc.dg/vect/pr116628.c
new file mode 100644
index 0000000..4068c65
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr116628.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target vect_float } */
+/* { dg-require-effective-target vect_masked_store } */
+/* { dg-additional-options "-Ofast -march=armv9-a" { target aarch64-*-* } } */
+
+typedef float c;
+c a[2000], b[0];
+void d() {
+ for (int e = 0; e < 2000; e++)
+ if (b[e])
+ a[e] = b[e];
+}
+
+/* { dg-final { scan-tree-dump "LOOP VECTORIZED" "vect" } } */
diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc
index f7c3c62..3a0d4cb 100644
--- a/gcc/tree-vect-patterns.cc
+++ b/gcc/tree-vect-patterns.cc
@@ -6685,6 +6685,9 @@ vect_recog_cond_store_pattern (vec_info *vinfo,
/* Check if the else value matches the original loaded one. */
bool invert = false;
tree cmp_ls = gimple_arg (cond_stmt, 0);
+ if (TREE_CODE (cmp_ls) != SSA_NAME)
+ return NULL;
+
tree cond_arg1 = gimple_arg (cond_stmt, 1);
tree cond_arg2 = gimple_arg (cond_stmt, 2);