aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/internal-fn.c2
-rw-r--r--gcc/testsuite/gcc.dg/pr96466.c19
-rw-r--r--gcc/tree.c2
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/internal-fn.c b/gcc/internal-fn.c
index 8efc77d..6cf2687 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 0000000..a8840f5
--- /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 4046deb..a1fc119 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