https://gcc.gnu.org/g:2c4438d39156493b5b382eb48b1f884ca5ab7ed4
commit r15-3518-g2c4438d39156493b5b382eb48b1f884ca5ab7ed4 Author: Tamar Christina <tamar.christ...@arm.com> Date: Fri Sep 6 14:05:43 2024 +0100 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. Diff: --- gcc/testsuite/gcc.dg/vect/pr116628.c | 14 ++++++++++++++ gcc/tree-vect-patterns.cc | 3 +++ 2 files changed, 17 insertions(+) diff --git a/gcc/testsuite/gcc.dg/vect/pr116628.c b/gcc/testsuite/gcc.dg/vect/pr116628.c new file mode 100644 index 00000000000..4068c657ac5 --- /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 f7c3c623ea4..3a0d4cb7092 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);