tree-optimization/105394 - vector lowering of compares
Commit Message
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 <rguenther@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(-)
@@ -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;