optabs.c: Make vector_compare_rtx cope with VOID mode constants (e.g. const0_rtx)
authorAlan Lawrence <alan.lawrence@arm.com>
Fri, 8 May 2015 11:40:33 +0000 (11:40 +0000)
committerAlan Lawrence <alalaw01@gcc.gnu.org>
Fri, 8 May 2015 11:40:33 +0000 (11:40 +0000)
* optabs.c (vector_compare_rtx): Handle RTL operands having VOIDmode.

From-SVN: r222907

gcc/ChangeLog
gcc/optabs.c

index fa1623f86d5daee71c376f56a80efec5d09a495d..1d3b0a976c5a5276f1d26b21616d63153425f32e 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-08  Alan Lawrence  <alan.lawrence@arm.com>
+
+       * optabs.c (vector_compare_rtx): Handle RTL operands having VOIDmode.
+
 2015-05-08  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        * config/glibc-stdint.h (OPTION_MUSL): Define.
index 983c8d9c64a038b828e89da8a7b987ddea44a086..fbf0e3834fb76f3e0374f783d6a4e836ade69ac2 100644 (file)
@@ -6544,18 +6544,28 @@ vector_compare_rtx (enum tree_code tcode, tree t_op0, tree t_op1,
 {
   struct expand_operand ops[2];
   rtx rtx_op0, rtx_op1;
+  machine_mode m0, m1;
   enum rtx_code rcode = get_rtx_code (tcode, unsignedp);
 
   gcc_assert (TREE_CODE_CLASS (tcode) == tcc_comparison);
 
-  /* Expand operands.  */
+  /* Expand operands.  For vector types with scalar modes, e.g. where int64x1_t
+     has mode DImode, this can produce a constant RTX of mode VOIDmode; in such
+     cases, use the original mode.  */
   rtx_op0 = expand_expr (t_op0, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op0)),
                         EXPAND_STACK_PARM);
+  m0 = GET_MODE (rtx_op0);
+  if (m0 == VOIDmode)
+    m0 = TYPE_MODE (TREE_TYPE (t_op0));
+
   rtx_op1 = expand_expr (t_op1, NULL_RTX, TYPE_MODE (TREE_TYPE (t_op1)),
                         EXPAND_STACK_PARM);
+  m1 = GET_MODE (rtx_op1);
+  if (m1 == VOIDmode)
+    m1 = TYPE_MODE (TREE_TYPE (t_op1));
 
-  create_input_operand (&ops[0], rtx_op0, GET_MODE (rtx_op0));
-  create_input_operand (&ops[1], rtx_op1, GET_MODE (rtx_op1));
+  create_input_operand (&ops[0], rtx_op0, m0);
+  create_input_operand (&ops[1], rtx_op1, m1);
   if (!maybe_legitimize_operands (icode, 4, 2, ops))
     gcc_unreachable ();
   return gen_rtx_fmt_ee (rcode, VOIDmode, ops[0].value, ops[1].value);