Commit 45a9968b by Richard Sandiford Committed by Richard Sandiford

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  <richard.sandiford@arm.com>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

	* 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 <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r242489
parent 41c7cac5
...@@ -2,6 +2,15 @@ ...@@ -2,6 +2,15 @@
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
* 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 <richard.sandiford@arm.com>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* cprop.c (local_cprop_find_used_regs): Use df_read_modify_subreg_p. * cprop.c (local_cprop_find_used_regs): Use df_read_modify_subreg_p.
2016-11-16 Richard Biener <rguenther@suse.de> 2016-11-16 Richard Biener <rguenther@suse.de>
...@@ -5283,14 +5283,15 @@ get_rtx_code (enum tree_code tcode, bool unsignedp) ...@@ -5283,14 +5283,15 @@ get_rtx_code (enum tree_code tcode, bool unsignedp)
return code; return code;
} }
/* Return comparison rtx for COND. Use UNSIGNEDP to select signed or /* Return a comparison rtx of mode CMP_MODE for COND. Use UNSIGNEDP to
unsigned operators. OPNO holds an index of the first comparison select signed or unsigned operators. OPNO holds the index of the
operand in insn with code ICODE. Do not generate compare instruction. */ first comparison operand for insn ICODE. Do not generate the
compare instruction itself. */
static rtx static rtx
vector_compare_rtx (enum tree_code tcode, tree t_op0, tree t_op1, vector_compare_rtx (machine_mode cmp_mode, enum tree_code tcode,
bool unsignedp, enum insn_code icode, tree t_op0, tree t_op1, bool unsignedp,
unsigned int opno) enum insn_code icode, unsigned int opno)
{ {
struct expand_operand ops[2]; struct expand_operand ops[2];
rtx rtx_op0, rtx_op1; rtx rtx_op0, rtx_op1;
...@@ -5318,7 +5319,7 @@ vector_compare_rtx (enum tree_code tcode, tree t_op0, tree t_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); create_input_operand (&ops[1], rtx_op1, m1);
if (!maybe_legitimize_operands (icode, opno, 2, ops)) if (!maybe_legitimize_operands (icode, opno, 2, ops))
gcc_unreachable (); 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 /* 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, ...@@ -5644,7 +5645,8 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
return 0; 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_op1 = expand_normal (op1);
rtx_op2 = expand_normal (op2); rtx_op2 = expand_normal (op2);
...@@ -5688,7 +5690,8 @@ expand_vec_cmp_expr (tree type, tree exp, rtx target) ...@@ -5688,7 +5690,8 @@ expand_vec_cmp_expr (tree type, tree exp, rtx target)
return 0; 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_output_operand (&ops[0], target, mask_mode);
create_fixed_operand (&ops[1], comparison); create_fixed_operand (&ops[1], comparison);
create_fixed_operand (&ops[2], XEXP (comparison, 0)); create_fixed_operand (&ops[2], XEXP (comparison, 0));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment