diff options
author | Richard Biener <rguenther@suse.de> | 2020-10-22 09:29:47 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-10-22 12:59:33 +0200 |
commit | b960a9c83a93b58a84a7a370002990810675ac5d (patch) | |
tree | a1bc199ac4abd02fdc1b27a6556e58529b932bd9 /gcc | |
parent | e14c2bdce0c058587bff56883cd22603eceeb0b0 (diff) | |
download | gcc-b960a9c83a93b58a84a7a370002990810675ac5d.zip gcc-b960a9c83a93b58a84a7a370002990810675ac5d.tar.gz gcc-b960a9c83a93b58a84a7a370002990810675ac5d.tar.bz2 |
middle-end/97521 - fix VECTOR_CST expansion
This fixes expansion of VECTOR_BOOLEAN_TYPE_P VECTOR_CSTs which
when using an integer mode are not always "mask-mode" but may
be using an integer mode when there's no supported vector mode.
The patch makes sure to only go the mask-mode expansion if
the elements do not line up to cover the full integer mode
(when they do and the mode was an actual mask-mode there's
no actual difference in both expansions).
2020-10-22 Richard Biener <rguenther@suse.de>
PR middle-end/97521
* expr.c (expand_expr_real_1): Be more careful when
expanding a VECTOR_BOOLEAN_TYPE_P VECTOR_CSTs.
* gcc.target/i386/pr97521.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/expr.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr97521.c | 27 |
2 files changed, 31 insertions, 1 deletions
@@ -10356,7 +10356,10 @@ expand_expr_real_1 (tree exp, rtx target, machine_mode tmode, scalar_int_mode int_mode; if (is_int_mode (mode, &int_mode)) { - if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp))) + if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)) + && maybe_ne (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (exp))) + * TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)), + GET_MODE_PRECISION (int_mode))) return const_scalar_mask_from_tree (int_mode, exp); else { diff --git a/gcc/testsuite/gcc.target/i386/pr97521.c b/gcc/testsuite/gcc.target/i386/pr97521.c new file mode 100644 index 0000000..804ffd6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr97521.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-options "-O -mno-sse2" } */ + +typedef unsigned char __attribute__ ((__vector_size__ (8))) V; +typedef unsigned long long __attribute__ ((__vector_size__ (16))) W; + +V c; +W d, e; + +V +foo (W f) +{ + W g = (W) { 0, 209 } <7 <= (0 < f); + W h = e + g + d; + V j = (V) (h[0]) + (V) c; + return j; +} + +int +main (void) +{ + V x = foo ((W) { 3 }); + for (unsigned i = 0; i < sizeof (x); i++) + if (x[i] != 0xff) + __builtin_abort (); + return 0; +} |