From: Richard Biener Date: Wed, 10 Jan 2024 13:54:10 +0000 (+0100) Subject: middle-end/112740 - vector boolean CTOR expansion issue X-Git-Tag: basepoints/gcc-15~3010 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125;p=thirdparty%2Fgcc.git middle-end/112740 - vector boolean CTOR expansion issue The optimization to expand uniform boolean vectors by sign-extension works only for dense masks but it failed to check that. PR middle-end/112740 * expr.cc (store_constructor): Check the integer vector mask has a single bit per element before using sign-extension to expand an uniform vector. * gcc.dg/pr112740.c: New testcase. --- diff --git a/gcc/expr.cc b/gcc/expr.cc index dc816bc20fa4..0bf80832fe50 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 000000000000..8250cafd2ffe --- /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; +}