From e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125 Mon Sep 17 00:00:00 2001 From: Richard Biener <rguenther@suse.de> Date: Wed, 10 Jan 2024 14:54:10 +0100 Subject: [PATCH] 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. --- gcc/expr.cc | 8 +++++--- gcc/testsuite/gcc.dg/pr112740.c | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr112740.c 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; +} -- GitLab