middle-end/96466 - fix VEC_COND isel/expansion issue
authorRichard Biener <rguenther@suse.de>
Wed, 23 Sep 2020 12:20:44 +0000 (14:20 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 23 Sep 2020 13:11:03 +0000 (15:11 +0200)
We need to avoid forcing BLKmode for truth vectors, instead do as
other code and use VOIDmode so layout_type can pick a suitable and
consistent mode.  RTL expansion of vect_cond_mask also needs to deal
with CONST_INT operands which means passing the mode explicitely.

2020-09-23  Richard Biener  <rguenther@suse.de>

PR middle-end/96466
* internal-fn.c (expand_vect_cond_mask_optab_fn): Use
appropriate mode for force_reg.
* tree.c (build_truth_vector_type_for): Pass VOIDmode to
make_vector_type.

* gcc.dg/pr96466.c: New testcase.

gcc/internal-fn.c
gcc/testsuite/gcc.dg/pr96466.c [new file with mode: 0644]
gcc/tree.c

index 8efc77d986b927dc4a37e396e6c710ffeda663ff..6cf2687fe6beddfb9ca7e08f7f3797508325fdca 100644 (file)
@@ -2644,7 +2644,7 @@ expand_vect_cond_mask_optab_fn (internal_fn, gcall *stmt, convert_optab optab)
   rtx_op2 = expand_normal (op2);
 
   mask = force_reg (mask_mode, mask);
-  rtx_op1 = force_reg (GET_MODE (rtx_op1), rtx_op1);
+  rtx_op1 = force_reg (mode, rtx_op1);
 
   rtx target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
   create_output_operand (&ops[0], target, mode);
diff --git a/gcc/testsuite/gcc.dg/pr96466.c b/gcc/testsuite/gcc.dg/pr96466.c
new file mode 100644 (file)
index 0000000..a8840f5
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR tree-optimization/96466 */
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-Og -finline-functions-called-once -fno-tree-ccp" } */
+
+typedef unsigned long __attribute__ ((__vector_size__ (8))) V;
+
+V
+bar (unsigned long x, V v)
+{
+  v &= x >= v;
+  return (V) v;
+}
+
+V
+foo (void)
+{
+  return bar (5, (V) 4441221375);
+}
index 4046debb72f4db666a80fb72906461f6313e85d2..a1fc119c0cc5ee4a27dc44ae276b5857abcf4a41 100644 (file)
@@ -10952,7 +10952,7 @@ build_truth_vector_type_for (tree vectype)
   unsigned HOST_WIDE_INT esize = vector_element_size (vsize, nunits);
   tree bool_type = build_nonstandard_boolean_type (esize);
 
-  return make_vector_type (bool_type, nunits, BLKmode);
+  return make_vector_type (bool_type, nunits, VOIDmode);
 }
 
 /* Like build_vector_type, but builds a variant type with TYPE_VECTOR_OPAQUE