From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1971) id BA4F0385043A; Thu, 20 Oct 2022 14:55:01 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BA4F0385043A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1666277701; bh=1dyL/N3VGn3ndGGMSep4f+Hc11hGmG2lmoCMLYEn5do=; h=From:To:Subject:Date:From; b=oO+E8wqFxjiUQvjOuaZbv0D1eZv/3TQsqeo3quWWLkZO4ke8+6Kig5l793PtLzUUF JK0Tb0wvWDt9Kvsl1nxlD/gK6+GIISOlnbpvK/8nReZ7qJC3dL6g0IYduwfkzlM+4m 21aq5j9nlO6yhoTqz9vPhl9y2bgajwM0FI83CYSc= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Andre Simoes Dias Vieira To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-3413] vect: Fix vectype when widening container type in bitfield pattern [PR107326] X-Act-Checkin: gcc X-Git-Author: Andre Vieira X-Git-Refname: refs/heads/master X-Git-Oldrev: 7bf3a4d36a8e59297ea65dd479ffe696f0974303 X-Git-Newrev: e10ca9544632dbff4759b4b92886cd96d0b9bdfe Message-Id: <20221020145501.BA4F0385043A@sourceware.org> Date: Thu, 20 Oct 2022 14:55:01 +0000 (GMT) List-Id: https://gcc.gnu.org/g:e10ca9544632dbff4759b4b92886cd96d0b9bdfe commit r13-3413-ge10ca9544632dbff4759b4b92886cd96d0b9bdfe Author: Andre Vieira Date: Thu Oct 20 15:54:39 2022 +0100 vect: Fix vectype when widening container type in bitfield pattern [PR107326] The 'vect_recog_bitfield_ref_pattern' was not correctly adapting the vectype when widening the container. gcc/ChangeLog: PR tree-optimization/107326 * tree-vect-patterns.cc (vect_recog_bitfield_ref_pattern): Change vectype when widening container. gcc/testsuite/ChangeLog: * gcc.dg/vect/pr107326.c: New test. * gcc.dg/vect/vect-bitfield-read-7.c: New test. Diff: --- gcc/testsuite/gcc.dg/vect/pr107326.c | 24 +++++++++++++ gcc/testsuite/gcc.dg/vect/vect-bitfield-read-7.c | 43 ++++++++++++++++++++++++ gcc/tree-vect-patterns.cc | 9 ++--- 3 files changed, 72 insertions(+), 4 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr107326.c b/gcc/testsuite/gcc.dg/vect/pr107326.c new file mode 100644 index 00000000000..333a515e741 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr107326.c @@ -0,0 +1,24 @@ +/* PR107326 */ +/* { dg-do compile } */ +struct Gsymtab { + unsigned int : 8; + unsigned int visited_somewhere : 1; +}; + +extern struct Gsymtab glob_symtab[]; + +int +visit_children (int i) +{ + int numvisited = 0; + + while (i < 1) + { + if (glob_symtab[i].visited_somewhere) + ++numvisited; + + ++i; + } + + return numvisited; +} diff --git a/gcc/testsuite/gcc.dg/vect/vect-bitfield-read-7.c b/gcc/testsuite/gcc.dg/vect/vect-bitfield-read-7.c new file mode 100644 index 00000000000..3b505db2bd3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-bitfield-read-7.c @@ -0,0 +1,43 @@ +/* { dg-require-effective-target vect_int } */ + +#include +#include "tree-vect.h" + +extern void abort(void); + +struct s { + unsigned i : 8; + char a : 4; +}; + +#define N 32 +#define ELT0 {0xFUL, 0} +#define ELT1 {0xFUL, 1} +#define ELT2 {0xFUL, 2} +#define ELT3 {0xFUL, 3} +#define RES 48 +struct s A[N] + = { ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3, + ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3, + ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3, + ELT0, ELT1, ELT2, ELT3, ELT0, ELT1, ELT2, ELT3}; + +int __attribute__ ((noipa)) +f(struct s *ptr, unsigned n) { + int res = 0; + for (int i = 0; i < n; ++i) + res += ptr[i].a; + return res; +} + +int main (void) +{ + check_vect (); + + if (f(&A[0], N) != RES) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */ diff --git a/gcc/tree-vect-patterns.cc b/gcc/tree-vect-patterns.cc index d18e1e60996..777ba2f5903 100644 --- a/gcc/tree-vect-patterns.cc +++ b/gcc/tree-vect-patterns.cc @@ -1922,7 +1922,8 @@ vect_recog_bitfield_ref_pattern (vec_info *vinfo, stmt_vec_info stmt_info, tree ret = gimple_assign_lhs (first_stmt); tree ret_type = TREE_TYPE (ret); bool shift_first = true; - tree vectype = get_vectype_for_scalar_type (vinfo, TREE_TYPE (container)); + tree container_type = TREE_TYPE (container); + tree vectype = get_vectype_for_scalar_type (vinfo, container_type); /* We move the conversion earlier if the loaded type is smaller than the return type to enable the use of widening loads. */ @@ -1933,15 +1934,15 @@ vect_recog_bitfield_ref_pattern (vec_info *vinfo, stmt_vec_info stmt_info, = gimple_build_assign (vect_recog_temp_ssa_var (ret_type), NOP_EXPR, container); container = gimple_get_lhs (pattern_stmt); - append_pattern_def_seq (vinfo, stmt_info, pattern_stmt); + container_type = TREE_TYPE (container); + vectype = get_vectype_for_scalar_type (vinfo, container_type); + append_pattern_def_seq (vinfo, stmt_info, pattern_stmt, vectype); } else if (!useless_type_conversion_p (TREE_TYPE (container), ret_type)) /* If we are doing the conversion last then also delay the shift as we may be able to combine the shift and conversion in certain cases. */ shift_first = false; - tree container_type = TREE_TYPE (container); - /* If the only use of the result of this BIT_FIELD_REF + CONVERT is a PLUS_EXPR then do the shift last as some targets can combine the shift and add into a single instruction. */