diff --git a/gcc/expr.cc b/gcc/expr.cc index 62cd8facf75..b7f4e2fda9e 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 00000000000..8a3e2e560d2 --- /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" } } */