From patchwork Tue Feb 18 15:56:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 1240152 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-519744-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha1 header.s=default header.b=t3ghhpTE; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48MQTN3CtYz9sRh for ; Wed, 19 Feb 2020 02:56:55 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:mime-version:content-type; q=dns; s=default; b=g/TdLzjE+Y7OkTDDgK0/E7AnofP4hrfDyu1lwS+TCSiqngpWEG geUx3vJ2qM0kCUkP/CvbQXDFYsryKccpyJNg7u1dH7jhQA8ZQJpu3wTgMGwUseO+ 2MLVwHA1IH7nKDz2gyWtE5NWthNPkRuPOk026kzXkMnLrVKIyasE7w77Q= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:mime-version:content-type; s= default; bh=5RWynyxy4bn6uu44aCQELuhD3so=; b=t3ghhpTEMb9aY6lwitUN c6uYY5ODsMOdSpTUMfEhkukk5OCosbYCSweFhuC8FiQlSpCdDQp7Mr7jz6xP1PCy aaywX+xof+uYl8Xxw28TXEOJccypjgW8D0TgMk3wRCZtKgqNf/LPpYDuGu/NhOas o4eetken6+tMnbn4N0NAl+g= Received: (qmail 19413 invoked by alias); 18 Feb 2020 15:56:47 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 19393 invoked by uid 89); 18 Feb 2020 15:56:44 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 18 Feb 2020 15:56:43 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 47EE2AF5C for ; Tue, 18 Feb 2020 15:56:36 +0000 (UTC) From: Martin Jambor To: GCC Patches Cc: Richard Biener Subject: [PATCH] sra: Do not create zero sized accesses (PR93776) User-Agent: Notmuch/0.29.3 (https://notmuchmail.org) Emacs/26.3 (x86_64-suse-linux-gnu) Date: Tue, 18 Feb 2020 16:56:35 +0100 Message-ID: MIME-Version: 1.0 X-IsSubscribed: yes Hi, SRA can get a bit confused with zero-sized accesses like the one in the testcase. Since there is nothing in the access, nothing is scalarized, but we can get order of the structures wrong, which the verifier is not happy about. Fixed by simply ignoring such accesses. Bootstrapped and tested on an x86_64-linux. OK for trunk? Thanks, Martin 2020-02-18 Martin Jambor PR tree-optimization/93776 * tree-sra.c (create_access): Do not create zero size accesses. (get_access_for_expr): Do not search for zero sized accesses. testsuite/ * gcc.dg/tree-ssa/pr93776.c: New test. --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr93776.c | 27 +++++++++++++++++++++++++ gcc/tree-sra.c | 5 ++++- 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr93776.c diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c new file mode 100644 index 00000000000..c407a627718 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93776.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + +struct empty {}; +struct s { int i; }; +struct z +{ + int j; + struct empty e; + struct s s; + int k; +}; + +void bar (struct z); +void baz (int); + +void foo (void) +{ + struct z z, z2; + + z.k = 8; + z2.s.i = 1; + z = z2; + bar (z); + z.e = (struct empty) {}; + baz (z.k); +} diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 0cfac0a8192..2c717805b68 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -926,6 +926,8 @@ create_access (tree expr, gimple *stmt, bool write) size = max_size; unscalarizable_region = true; } + if (size == 0) + return NULL; if (size < 0) { disqualify_candidate (base, "Encountered an unconstrained access."); @@ -3629,7 +3631,8 @@ get_access_for_expr (tree expr) return NULL; } - if (!bitmap_bit_p (candidate_bitmap, DECL_UID (base))) + if (max_size == 0 + || !bitmap_bit_p (candidate_bitmap, DECL_UID (base))) return NULL; return get_var_base_offset_size_access (base, offset, max_size);