Hi All, 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. Bootstrapped Regtested on aarch64-none-linux-gnu and no issues. Ok for master? Thanks, Tamar 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 --git a/gcc/testsuite/gcc.dg/vect/pr116628.c b/gcc/testsuite/gcc.dg/vect/pr116628.c new file mode 100644 index 0000000000000000000000000000000000000000..4068c657ac5570b10f2dca4be5109abbaf574f55 --- /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 f7c3c623ea46ea09f4f86139d2a92bb6363aee3c..3a0d4cb7092cb59fe8b8664b682ade73ab5e9645 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); --
diff --git a/gcc/testsuite/gcc.dg/vect/pr116628.c b/gcc/testsuite/gcc.dg/vect/pr116628.c new file mode 100644 index 0000000000000000000000000000000000000000..4068c657ac5570b10f2dca4be5109abbaf574f55 --- /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 f7c3c623ea46ea09f4f86139d2a92bb6363aee3c..3a0d4cb7092cb59fe8b8664b682ade73ab5e9645 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);