diff --git a/gcc/expr.cc b/gcc/expr.cc index dc816bc20fa4d59dd2bb5256b4142a5312f54c83..0bf80832fe50555a86b2406b4e2019bc992cb8df 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -7841,10 +7841,12 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, break; } /* Use sign-extension for uniform boolean vectors with - integer modes. Effectively "vec_duplicate" for bitmasks. */ - if (!TREE_SIDE_EFFECTS (exp) + integer modes and single-bit mask entries. + Effectively "vec_duplicate" for bitmasks. */ + if (elt_size == 1 + && !TREE_SIDE_EFFECTS (exp) && VECTOR_BOOLEAN_TYPE_P (type) - && SCALAR_INT_MODE_P (mode) + && SCALAR_INT_MODE_P (TYPE_MODE (type)) && (elt = uniform_vector_p (exp)) && !VECTOR_TYPE_P (TREE_TYPE (elt))) { diff --git a/gcc/testsuite/gcc.dg/pr112740.c b/gcc/testsuite/gcc.dg/pr112740.c new file mode 100644 index 0000000000000000000000000000000000000000..8250cafd2ffe27cd3555cd22520220de86d247f8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr112740.c @@ -0,0 +1,19 @@ +/* { dg-do run { target { int128 } } } */ +/* { dg-options "" } */ + +typedef unsigned __int128 __attribute__((__vector_size__ (16))) V; + +V +foo (unsigned c, V v) +{ + return (V) (c <= v) == 0; +} + +int +main (void) +{ + V x = foo (0, (V) { }); + if (x[0]) + __builtin_abort (); + return 0; +}