The following fixes missing handling of non-integer mode but masked (SVE or MVE) compares in vector lowering by using the appropriate mask element width to extract the components and adjust the index.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Alex is testing this on ARM - if that goes OK can you push this to trunk, preferably with the testcase added to gcc.target/arm? Thanks, Richard. 2022-04-29 Richard Biener <rguent...@suse.de> PR tree-optimization/105394 * tree-vect-generic.cc (expand_vector_condition): Adjust comp_width for non-integer mode masks as well. --- gcc/tree-vect-generic.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gcc/tree-vect-generic.cc b/gcc/tree-vect-generic.cc index 8b7227e8b58..e5bd9dc7c76 100644 --- a/gcc/tree-vect-generic.cc +++ b/gcc/tree-vect-generic.cc @@ -1122,6 +1122,9 @@ expand_vector_condition (gimple_stmt_iterator *gsi, bitmap dce_ssa_names) tree atype = build_nonstandard_integer_type (prec, 1); a = gimplify_build1 (gsi, VIEW_CONVERT_EXPR, atype, a); } + else if (!a_is_comparison + && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (a))) + comp_width = vector_element_bits_tree (TREE_TYPE (a)); int nunits = nunits_for_known_piecewise_op (type); vec_alloc (v, nunits); @@ -1148,7 +1151,7 @@ expand_vector_condition (gimple_stmt_iterator *gsi, bitmap dce_ssa_names) build_zero_cst (TREE_TYPE (a))); } else - aa = tree_vec_extract (gsi, cond_type, a, width, index); + aa = tree_vec_extract (gsi, cond_type, a, comp_width, comp_index); result = gimplify_build3 (gsi, COND_EXPR, inner_type, aa, bb, cc); if (!CONSTANT_CLASS_P (result)) constant_p = false; -- 2.34.1