From 45a9968b378d54ced8f742e1ff8b01c9378b339c Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 16 Nov 2016 13:09:12 +0000 Subject: [PATCH] Fix vec_cmp comparison mode vec_cmps assign the result of a vector comparison to a mask. The optab was called with the destination having mode mask_mode but with the source (the comparison) having mode VOIDmode, which led to invalid rtl if the source operand was used directly. gcc/ 2016-11-15 Richard Sandiford Alan Hayward David Sherwood * optabs.c (vector_compare_rtx): Add a cmp_mode parameter and use it in the final call to gen_rtx_fmt_ee. (expand_vec_cond_expr): Update accordingly. (expand_vec_cmp_expr): Likewise. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r242489 --- gcc/ChangeLog | 9 +++++++++ gcc/optabs.c | 21 ++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe32d0f7d31..a49cda325b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-11-16 Richard Sandiford + Alan Hayward + David Sherwood + + * optabs.c (vector_compare_rtx): Add a cmp_mode parameter + and use it in the final call to gen_rtx_fmt_ee. + (expand_vec_cond_expr): Update accordingly. + (expand_vec_cmp_expr): Likewise. + 2016-11-16 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/optabs.c b/gcc/optabs.c index 7a1f02533bc..b135c9b3cc2 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -5283,14 +5283,15 @@ get_rtx_code (enum tree_code tcode, bool unsignedp) return code; } -/* Return comparison rtx for COND. Use UNSIGNEDP to select signed or - unsigned operators. OPNO holds an index of the first comparison - operand in insn with code ICODE. Do not generate compare instruction. */ +/* Return a comparison rtx of mode CMP_MODE for COND. Use UNSIGNEDP to + select signed or unsigned operators. OPNO holds the index of the + first comparison operand for insn ICODE. Do not generate the + compare instruction itself. */ static rtx -vector_compare_rtx (enum tree_code tcode, tree t_op0, tree t_op1, - bool unsignedp, enum insn_code icode, - unsigned int opno) +vector_compare_rtx (machine_mode cmp_mode, enum tree_code tcode, + tree t_op0, tree t_op1, bool unsignedp, + enum insn_code icode, unsigned int opno) { struct expand_operand ops[2]; rtx rtx_op0, rtx_op1; @@ -5318,7 +5319,7 @@ vector_compare_rtx (enum tree_code tcode, tree t_op0, tree t_op1, create_input_operand (&ops[1], rtx_op1, m1); if (!maybe_legitimize_operands (icode, opno, 2, ops)) gcc_unreachable (); - return gen_rtx_fmt_ee (rcode, VOIDmode, ops[0].value, ops[1].value); + return gen_rtx_fmt_ee (rcode, cmp_mode, ops[0].value, ops[1].value); } /* Checks if vec_perm mask SEL is a constant equivalent to a shift of the first @@ -5644,7 +5645,8 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2, return 0; } - comparison = vector_compare_rtx (tcode, op0a, op0b, unsignedp, icode, 4); + comparison = vector_compare_rtx (VOIDmode, tcode, op0a, op0b, unsignedp, + icode, 4); rtx_op1 = expand_normal (op1); rtx_op2 = expand_normal (op2); @@ -5688,7 +5690,8 @@ expand_vec_cmp_expr (tree type, tree exp, rtx target) return 0; } - comparison = vector_compare_rtx (tcode, op0a, op0b, unsignedp, icode, 2); + comparison = vector_compare_rtx (mask_mode, tcode, op0a, op0b, + unsignedp, icode, 2); create_output_operand (&ops[0], target, mask_mode); create_fixed_operand (&ops[1], comparison); create_fixed_operand (&ops[2], XEXP (comparison, 0)); -- 2.30.2