bswap: Fix up a thinko with empty CONSTRUCTORs [PR98378]
authorJakub Jelinek <jakub@redhat.com>
Sat, 19 Dec 2020 11:46:40 +0000 (12:46 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 19 Dec 2020 11:46:40 +0000 (12:46 +0100)
The code I've added recently in find_bswap_or_nop for VECTOR CONSTRUCTORs
is missing punt on an important case - namely empty CONSTRUCTORs, because in that
case the loop will not initialize *n and the code after the loop will then
use the uninitialized structure.

2020-12-19  Jakub Jelinek  <jakub@redhat.com>

PR tree-optimization/98378
* gimple-ssa-store-merging.c (find_bswap_or_nop): Punt if CONSTRUCTOR
has no elements.

gcc/gimple-ssa-store-merging.c

index 2894205fa3c3f5e7b757fa5c4dacde353aafd20b..2ab51e23c077d7208ebaa4be5400aa8636a5d82a 100644 (file)
@@ -873,6 +873,8 @@ find_bswap_or_nop (gimple *stmt, struct symbolic_number *n, bool *bswap)
       if (sz != 16 && sz != 32 && sz != 64)
        return NULL;
       tree rhs = gimple_assign_rhs1 (stmt);
+      if (CONSTRUCTOR_NELTS (rhs) == 0)
+       return NULL;
       tree eltype = TREE_TYPE (TREE_TYPE (rhs));
       unsigned HOST_WIDE_INT eltsz
        = int_size_in_bytes (eltype) * BITS_PER_UNIT;