aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/expr.cc13
-rw-r--r--gcc/testsuite/gcc.target/i386/pr110452.c13
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/expr.cc b/gcc/expr.cc
index 62cd8fa..b7f4e2f 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -7447,6 +7447,19 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size,
emit_move_insn (target, ops[0].value);
break;
}
+ /* Use sign-extension for uniform boolean vectors with
+ integer modes. */
+ if (!TREE_SIDE_EFFECTS (exp)
+ && VECTOR_BOOLEAN_TYPE_P (type)
+ && SCALAR_INT_MODE_P (mode)
+ && (elt = uniform_vector_p (exp))
+ && !VECTOR_TYPE_P (TREE_TYPE (elt)))
+ {
+ rtx op0 = force_reg (TYPE_MODE (TREE_TYPE (elt)),
+ expand_normal (elt));
+ convert_move (target, op0, 0);
+ break;
+ }
n_elts = TYPE_VECTOR_SUBPARTS (type);
if (REG_P (target)
diff --git a/gcc/testsuite/gcc.target/i386/pr110452.c b/gcc/testsuite/gcc.target/i386/pr110452.c
new file mode 100644
index 0000000..8a3e2e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr110452.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-vectorize -fno-vect-cost-model -mavx512f -mprefer-vector-width=512" } */
+
+double a[1024], b[1024], c[1024];
+
+void foo (int flag, int n)
+{
+ _Bool x = flag == 3;
+ for (int i = 0; i < n; ++i)
+ a[i] = (x ? b[i] : c[i]) * 42.;
+}
+
+/* { dg-final { scan-assembler-not "\[^x\]orl" } } */