https://gcc.gnu.org/g:c81543b3379fa11742d2178b87edbf1e72799d61
commit r15-7020-gc81543b3379fa11742d2178b87edbf1e72799d61 Author: Richard Biener <rguent...@suse.de> Date: Fri Jan 17 15:41:19 2025 +0100 tree-optimization/118529 - ICE with condition vectorization On sparc we end up choosing vector(8) <signed-boolean:1> for the condition but vector(2) int for the value of a COND_EXPR but we fail to verify their shapes match and thus things go downhill. This is a missed-optimization on the pattern recognition side as well as unhandled vector decomposition in vectorizable_condition. The following plugs just the observed ICE for now. PR tree-optimization/118529 * tree-vect-stmts.cc (vectorizable_condition): Check the shape of the vector and condition vector type are compatible. * gcc.target/sparc/pr118529.c: New testcase. Diff: --- gcc/testsuite/gcc.target/sparc/pr118529.c | 17 +++++++++++++++++ gcc/tree-vect-stmts.cc | 5 +++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gcc/testsuite/gcc.target/sparc/pr118529.c b/gcc/testsuite/gcc.target/sparc/pr118529.c new file mode 100644 index 000000000000..1393763e9db2 --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/pr118529.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -mvis3" } */ + +long c; +int d[10]; +int e; +void g() { + int b = 1 & e; + int *f = d; + b = -b; + c = 0; + for (; c < 10; c++) { + int h = f[c] ^ c; + h &= b; + f[c] ^= h; + } +} diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index b5dd1a2e40f1..833029fcb001 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -12676,8 +12676,9 @@ vectorizable_condition (vec_info *vinfo, masked = !COMPARISON_CLASS_P (cond_expr); vec_cmp_type = truth_type_for (comp_vectype); - - if (vec_cmp_type == NULL_TREE) + if (vec_cmp_type == NULL_TREE + || maybe_ne (TYPE_VECTOR_SUBPARTS (vectype), + TYPE_VECTOR_SUBPARTS (vec_cmp_type))) return false; cond_code = TREE_CODE (cond_expr);