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.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2020-09-23  Richard Biener  <rguent...@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              |  2 +-
 gcc/testsuite/gcc.dg/pr96466.c | 19 +++++++++++++++++++
 gcc/tree.c                     |  2 +-
 3 files changed, 21 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr96466.c

diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index 8efc77d986b..6cf2687fe6b 100644
--- a/gcc/internal-fn.c
+++ b/gcc/internal-fn.c
@@ -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
index 00000000000..a8840f5b6a7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr96466.c
@@ -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);
+}
diff --git a/gcc/tree.c b/gcc/tree.c
index 4046debb72f..a1fc119c0cc 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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
-- 
2.26.2

Reply via email to