diff options
author | Richard Biener <rguenther@suse.de> | 2024-01-10 14:54:10 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2024-01-11 09:09:46 +0100 |
commit | e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125 (patch) | |
tree | 7ee4abd90951906b38825b0bc5f95e2c913a3bcc /gcc | |
parent | 1a51886a79c97e53ba945c1926ab215ed6a9f5ed (diff) | |
download | gcc-e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125.zip gcc-e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125.tar.gz gcc-e1f2d58a1e2536f13d3f2ea2d7373ae62cec9125.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expr.cc | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr112740.c | 19 |
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/expr.cc b/gcc/expr.cc index dc816bc..0bf8083 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 0000000..8250caf --- /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; +} |