Hi,
In the vec_cbranch_all/any optimization we prepare the length and bias
operands slightly differently than expected. This patch fixes it.
Bootstrapped and regtested on x86, regtested on riscv64.
Regards
Robin
gcc/ChangeLog:
* optabs.cc (emit_cmp_and_jump_insns): Fix len/bias operands.
---
gcc/optabs.cc | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/gcc/optabs.cc b/gcc/optabs.cc
index 183ad910fcd..8dea94975c1 100644
--- a/gcc/optabs.cc
+++ b/gcc/optabs.cc
@@ -4928,11 +4928,16 @@ emit_cmp_and_jump_insns (rtx x, rtx y, enum rtx_code
comparison, rtx size,
rtx len_bias_rtx = expand_normal (len_bias);
tree lhs = gimple_get_lhs (def_stmt);
auto mask_mode = TYPE_MODE (TREE_TYPE (lhs));
+ /* ??? We could use something like internal_fn's
+ add_mask_else_and_len_args here. Currently it
+ only supports a fixed, consecutive order of
+ mask and len, though. */
create_input_operand (&ops[0], CONSTM1_RTX (mask_mode),
mask_mode);
- create_input_operand (&ops[3], len_rtx, GET_MODE (len_rtx));
- create_input_operand (&ops[4], len_bias_rtx,
- GET_MODE (len_bias_rtx));
+ create_convert_operand_from
+ (&ops[3], len_rtx, TYPE_MODE (TREE_TYPE (len_op)),
+ TYPE_UNSIGNED (TREE_TYPE (len_op)));
+ create_input_operand (&ops[4], len_bias_rtx, QImode);
}
int unsignedp2 = TYPE_UNSIGNED (TREE_TYPE (t_op0));
--
2.51.1