From patchwork Tue Oct 26 19:19:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Vladimir Makarov X-Patchwork-Id: 46669 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8DB293858423 for ; Tue, 26 Oct 2021 19:20:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8DB293858423 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1635276048; bh=VxpPWk2ozJMMcYIFlpqkPUg9rqM7Jtltip+6+oGGR3s=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=AoIAo60qaVSZUQqlw7BeECVnioYuiwMoRvdPBXNQF3I8Zj+Z6J/uEN3Vg+snZ818E kMstAqYPlBbMeu5ubhRfJqk0V0vVxLswgP9lfgVZV4Dsn5rbkzP6jE/SgJ9RPHvj8/ cbSSF3akAqDNdej346XesMPO0+L/U/Yh/np77jYI= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 158443858C60 for ; Tue, 26 Oct 2021 19:19:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 158443858C60 Received: from mail-io1-f70.google.com (mail-io1-f70.google.com [209.85.166.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-39-lkM4d_wzNbGcsbNeexsUtw-1; Tue, 26 Oct 2021 15:19:54 -0400 X-MC-Unique: lkM4d_wzNbGcsbNeexsUtw-1 Received: by mail-io1-f70.google.com with SMTP id r15-20020a6b600f000000b005dde03edc0cso327008iog.6 for ; Tue, 26 Oct 2021 12:19:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent :content-language:from:subject:to; bh=JFrCdQqH3hhapupvLbuqYX9nWpLptOJbDTj+wRraiHs=; b=qdAuZRu3nON0r6gqZ87Yh+CfdaP9rvN0PyRsc3JROj13PBicrQn4eqSSfllmpGmGms vLKZJrmQFdCgXR+rOMsZ43vctc+NBrgFR9BNixsI1f5s5UMIkhmOGqDYi4HJV3fEbn+0 AZeAaUIpHrknsD0Ac6w8aitci4Xnc4PM9/UHRgViVr/bEAc2NayUOIhggW72+8OoZCA2 WJdwpq55iE/94TLlTcgqzCsrzzuNgMPbTWPWdoF9XqEghqOu3b6eiIcgPjXx3LKrNdZD uRJG17+7iKE6snAz96PVUMcI+U+Jd+ObJo/XIzAeTNc5MME8hHCTjfTGEBdmiMTGgW5s 5JBQ== X-Gm-Message-State: AOAM533wjjY35ZuF1iY/IBu5f+opHJoiUiZkXCQCleJzuurtctmYG/3w jV2CLC4YHzOpdbUIQa/UfvBWUhJ6qmCTBlI4cGFKo7zrvOOr0nFDMLvZI4qEsgWOkGEqCVFU5c/ T7+xlgjXN8ixnAtzssMnhUDK/4SsieaAos3ENNtIXMXoqsBio7zL8p4oXNnQCPRjKY6Zukw== X-Received: by 2002:a05:6638:144d:: with SMTP id l13mr347398jad.121.1635275993313; Tue, 26 Oct 2021 12:19:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzXOCgMDLgZxc5L/v4iRwa8PfG+ajSurY7Mx5rcuzEstGyhzPeqmhYWaGP0QqNkDtUU7qv8XQ== X-Received: by 2002:a05:6638:144d:: with SMTP id l13mr347376jad.121.1635275992922; Tue, 26 Oct 2021 12:19:52 -0700 (PDT) Received: from [192.168.1.113] ([69.165.238.126]) by smtp.gmail.com with ESMTPSA id j15sm12050097ile.65.2021.10.26.12.19.52 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 26 Oct 2021 12:19:52 -0700 (PDT) Message-ID: <1f9a895e-3557-e859-de29-0b7d922592fa@redhat.com> Date: Tue, 26 Oct 2021 15:19:51 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.1.0 Subject: [committed] [PR102842] LRA: Consider all outputs in generation of matching reloads To: "gcc-patches@gcc.gnu.org" X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Vladimir Makarov via Gcc-patches From: Vladimir Makarov Reply-To: Vladimir Makarov Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The following patch fixes https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102842 As the patch touches a sensitive LRA code, the patch was bootstrapped tested on x86-64, aarch64, and ppc64. I've committed the patch only in master branch.  Later (after some observation), I'll commit it into gcc-10 and gcc-11 branches. commit 8c59f4118357789cfa8df2cf0d3ecb61be7e9041 Author: Vladimir N. Makarov Date: Tue Oct 26 14:03:42 2021 -0400 [PR102842] Consider all outputs in generation of matching reloads Without considering all output insn operands (not only processed before), in rare cases LRA can use the same hard register for different outputs of the insn on different assignment subpasses. The patch fixes the problem. gcc/ChangeLog: PR rtl-optimization/102842 * lra-constraints.c (match_reload): Ignore out in checking values of outs. (curr_insn_transform): Collect outputs before doing reloads of operands. gcc/testsuite/ChangeLog: PR rtl-optimization/102842 * g++.target/arm/pr102842.C: New test. diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 8f75125fc2e..0195b4fb9c3 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -1102,7 +1102,7 @@ match_reload (signed char out, signed char *ins, signed char *outs, for (i = 0; outs[i] >= 0; i++) { rtx other_out_rtx = *curr_id->operand_loc[outs[i]]; - if (REG_P (other_out_rtx) + if (outs[i] != out && REG_P (other_out_rtx) && (regno_val_use_in (REGNO (in_rtx), other_out_rtx) != NULL_RTX)) { @@ -4382,7 +4382,10 @@ curr_insn_transform (bool check_only_p) } n_outputs = 0; - outputs[0] = -1; + for (i = 0; i < n_operands; i++) + if (curr_static_id->operand[i].type == OP_OUT) + outputs[n_outputs++] = i; + outputs[n_outputs] = -1; for (i = 0; i < n_operands; i++) { int regno; @@ -4457,8 +4460,6 @@ curr_insn_transform (bool check_only_p) lra-lives.c. */ match_reload (i, goal_alt_matched[i], outputs, goal_alt[i], &before, &after, TRUE); - outputs[n_outputs++] = i; - outputs[n_outputs] = -1; } continue; } @@ -4636,14 +4637,6 @@ curr_insn_transform (bool check_only_p) process_alt_operands decides that it is possible. */ gcc_unreachable (); - /* Memorise processed outputs so that output remaining to be processed - can avoid using the same register value (see match_reload). */ - if (curr_static_id->operand[i].type == OP_OUT) - { - outputs[n_outputs++] = i; - outputs[n_outputs] = -1; - } - if (optional_p) { rtx reg = op; diff --git a/gcc/testsuite/g++.target/arm/pr102842.C b/gcc/testsuite/g++.target/arm/pr102842.C new file mode 100644 index 00000000000..a2bac66091a --- /dev/null +++ b/gcc/testsuite/g++.target/arm/pr102842.C @@ -0,0 +1,30 @@ +/* PR rtl-optimization/102842 */ +/* { dg-do compile } */ +/* { dg-options "-fPIC -O2 -fno-omit-frame-pointer -mthumb -march=armv7-a+fp" } */ + +struct Plane { + using T = float; + T *Row(); +}; +using ImageF = Plane; +long long Mirror_x; +struct EnsurePaddingInPlaceRowByRow { + void Process() { + switch (strategy_) { + case kSlow: + float *row = img_.Row(); + long long xsize = x1_; + while (Mirror_x >= xsize) + if (Mirror_x) + Mirror_x = 2 * xsize - 1; + *row = Mirror_x; + } + } + ImageF img_; + unsigned x1_; + enum { kSlow } strategy_; +}; +void FinalizeImageRect() { + EnsurePaddingInPlaceRowByRow ensure_padding; + ensure_padding.Process(); +}