From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1201) id 57D9A3857005; Tue, 6 Oct 2020 11:42:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 57D9A3857005 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Matthias Klose To: gcc-cvs@gcc.gnu.org Subject: [gcc r10-8859] Backport fix for PR/tree-optimization/97236 - fix bad use of VMAT_CONTIGUOUS X-Act-Checkin: gcc X-Git-Author: Matthias Klose X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 7cacf5a576675109f3b081cbd436d1fbadad776d X-Git-Newrev: 1ab88985631dd2c5a5e3b5c0dce47cf8b6ed2f82 Message-Id: <20201006114241.57D9A3857005@sourceware.org> Date: Tue, 6 Oct 2020 11:42:41 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 06 Oct 2020 11:42:41 -0000 https://gcc.gnu.org/g:1ab88985631dd2c5a5e3b5c0dce47cf8b6ed2f82 commit r10-8859-g1ab88985631dd2c5a5e3b5c0dce47cf8b6ed2f82 Author: Matthias Klose Date: Tue Oct 6 13:41:37 2020 +0200 Backport fix for PR/tree-optimization/97236 - fix bad use of VMAT_CONTIGUOUS This avoids using VMAT_CONTIGUOUS with single-element interleaving when using V1mode vectors. Instead keep VMAT_ELEMENTWISE but continue to avoid load-lanes and gathers. 2020-10-01 Richard Biener PR tree-optimization/97236 * tree-vect-stmts.c (get_group_load_store_type): Keep VMAT_ELEMENTWISE for single-element vectors. * gcc.dg/vect/pr97236.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/pr97236.c | 43 +++++++++++++++++++++++++++++++++++++ gcc/tree-vect-stmts.c | 20 ++++++++--------- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/gcc/testsuite/gcc.dg/vect/pr97236.c b/gcc/testsuite/gcc.dg/vect/pr97236.c new file mode 100644 index 00000000000..9d3dc20d953 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/pr97236.c @@ -0,0 +1,43 @@ +typedef unsigned char __uint8_t; +typedef __uint8_t uint8_t; +typedef struct plane_t { + uint8_t *p_pixels; + int i_lines; + int i_pitch; +} plane_t; + +typedef struct { + plane_t p[5]; +} picture_t; + +#define N 4 + +void __attribute__((noipa)) +picture_Clone(picture_t *picture, picture_t *res) +{ + for (int i = 0; i < N; i++) { + res->p[i].p_pixels = picture->p[i].p_pixels; + res->p[i].i_lines = picture->p[i].i_lines; + res->p[i].i_pitch = picture->p[i].i_pitch; + } +} + +int +main() +{ + picture_t aaa, bbb; + uint8_t pixels[10] = {1, 1, 1, 1, 1, 1, 1, 1}; + + for (unsigned i = 0; i < N; i++) + aaa.p[i].p_pixels = pixels; + + picture_Clone (&aaa, &bbb); + + uint8_t c = 0; + for (unsigned i = 0; i < N; i++) + c += bbb.p[i].p_pixels[0]; + + if (c != N) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 9ace345fc5e..d8b2ff3d6ee 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -2413,25 +2413,23 @@ get_group_load_store_type (stmt_vec_info stmt_info, tree vectype, bool slp, /* First cope with the degenerate case of a single-element vector. */ if (known_eq (TYPE_VECTOR_SUBPARTS (vectype), 1U)) - *memory_access_type = VMAT_CONTIGUOUS; + ; /* Otherwise try using LOAD/STORE_LANES. */ - if (*memory_access_type == VMAT_ELEMENTWISE - && (vls_type == VLS_LOAD - ? vect_load_lanes_supported (vectype, group_size, masked_p) - : vect_store_lanes_supported (vectype, group_size, - masked_p))) + else if (vls_type == VLS_LOAD + ? vect_load_lanes_supported (vectype, group_size, masked_p) + : vect_store_lanes_supported (vectype, group_size, + masked_p)) { *memory_access_type = VMAT_LOAD_STORE_LANES; overrun_p = would_overrun_p; } /* If that fails, try using permuting loads. */ - if (*memory_access_type == VMAT_ELEMENTWISE - && (vls_type == VLS_LOAD - ? vect_grouped_load_supported (vectype, single_element_p, - group_size) - : vect_grouped_store_supported (vectype, group_size))) + else if (vls_type == VLS_LOAD + ? vect_grouped_load_supported (vectype, single_element_p, + group_size) + : vect_grouped_store_supported (vectype, group_size)) { *memory_access_type = VMAT_CONTIGUOUS_PERMUTE; overrun_p = would_overrun_p;