https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114375
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
I see that get_load_store_type and get_group_load_store_type return VMAT_*
kinds that do not handle the masked case. There's some rejection in the
callers for that case but it's also incomplete (VMAT_ELEMENTWISE and
VMAT_STRIDED_SLP but I also think VMAT_CONTIGUOUS_PERMUTE/REVERSE misses
some handling, at least the optab check).
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index e8617439a48..5a4eb136c6d 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -10080,6 +10080,14 @@ vectorizable_load (vec_info *vinfo,
"unsupported masked emulated gather.\n");
return false;
}
+ else if (memory_access_type == VMAT_ELEMENTWISE
+ || memory_access_type == VMAT_STRIDED_SLP)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "unsupported masked strided access.\n");
+ return false;
+ }
}
bool costing_p = !vec_stmt;
should plug the elementwise/SLP case. Interestingly
void __attribute__((noipa))
foo (int s, int * __restrict p)
{
for (int i = 0; i < 64; ++i)
{
int tem = 0;
if (a[i])
tem = p[s*i];
b[i] = tem;
}
}
uses VMAT_GATHER_SCATTER, I failed to get it produce VMAT_ELEMENTWISE.