From 80d67d8f682a6050a3bf4dcfa18a83f321986f2a Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 4 Dec 2023 12:50:36 +0100 Subject: [PATCH] tree-optimization/112818 - re-instantiate vector type size check for bswap For __builtin_bswap vectorization we still require an equal vector type size. Re-instantiate that check. PR tree-optimization/112818 * tree-vect-stmts.cc (vectorizable_bswap): Check input and output vector types have the same size. * gcc.dg/vect/pr112818.c: New testcase. --- gcc/testsuite/gcc.dg/vect/pr112818.c | 34 ++++++++++++++++++++++++++++++++++ gcc/tree-vect-stmts.cc | 9 +++++++++ 2 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/vect/pr112818.c diff --git a/gcc/testsuite/gcc.dg/vect/pr112818.c b/gcc/testsuite/gcc.dg/vect/pr112818.c new file mode 100644 index 00000000000..61a30a576b7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr112818.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ + +extern char tag_data[]; +struct pppoe_tag { + unsigned short tag_type; + unsigned short tag_len; +}; + +char code; +int *add_tag_pack; +void *add_tag_data; +short e; +long c, d; + +static int add_tag(int type, int len) { + short a, b; + struct pppoe_tag *tag = (struct pppoe_tag *)add_tag_pack; + if (e + len || len < 0) + return 1; + b = __builtin_bswap16(type); + tag->tag_type = b; + a = __builtin_bswap16(len); + tag->tag_len = a; + if (add_tag_data) + __builtin___memcpy_chk(tag_data, add_tag_data, len, c); + return 0; +} +void pppoe_serv_read() { + switch (code) + case 9: { + add_tag(2, d); + add_tag(0, 2); + } +} diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc index 067abac3917..390c8472fd6 100644 --- a/gcc/tree-vect-stmts.cc +++ b/gcc/tree-vect-stmts.cc @@ -2976,6 +2976,15 @@ vectorizable_bswap (vec_info *vinfo, gcc_assert (ncopies >= 1); + if (TYPE_SIZE (vectype_in) != TYPE_SIZE (vectype)) + { + if (dump_enabled_p ()) + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "mismatched vector sizes %T and %T\n", + vectype_in, vectype); + return false; + } + tree char_vectype = get_same_sized_vectype (char_type_node, vectype_in); if (! char_vectype) return false; -- 2.11.4.GIT