From patchwork Tue Feb 7 14:07:56 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vladimir Makarov X-Patchwork-Id: 1738980 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=nGkjy7yS; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PB4jZ66Ydz23j7 for ; Wed, 8 Feb 2023 01:08:33 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A3F353858C2D for ; Tue, 7 Feb 2023 14:08:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A3F353858C2D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1675778910; bh=1cx9kzkXR6prYEQQA9vCeI9Y/TheeVmk7+6XH2x0xrQ=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=nGkjy7ySFjKbZoIN545NwYTOJKUiLbnvtrVgmNBmfeC+wXjEGsQVp5ibkgyHh01DE Z6n3KMVLK4C+qukK//e2FAAUAnUTdlTIU/aSJXeR0bvsaK6X3JpC9uDOFYuXuExpcq k/TguDYcQgsC5HVHLERWyjFYZbbo5ie1oMc6rKPQ= 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 AC3013858C00 for ; Tue, 7 Feb 2023 14:08:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AC3013858C00 Received: from mail-il1-f197.google.com (mail-il1-f197.google.com [209.85.166.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-441-O8-GgzgKMfeD83ffpPnazA-1; Tue, 07 Feb 2023 09:08:00 -0500 X-MC-Unique: O8-GgzgKMfeD83ffpPnazA-1 Received: by mail-il1-f197.google.com with SMTP id n18-20020a056e02101200b0030f2b79c2ffso10638553ilj.20 for ; Tue, 07 Feb 2023 06:08:00 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=nMWUYLS+031T3ni4d1l6UYwHVSy1SFEOnQAlVKtfb3I=; b=oz3+YLILQOksUrSG7lCzT7YeRL2UrdRGNs5lCKsl2CG7mGPyfPA+wLS6pnW8dzuVap jdu9mEzeWyGLjgDyeGFNYnMRPI4ccbpzr1RvESMKkSPC8xsEElH0o8qdWLNAPKFaz+wo 6HHiBVE53qS0OHAYPKclIQF09NU+WC3HrGJBKJpiDauk5LN35wxpXzK8XbP9DWqMTCnr Z8Bjx41SCCOhkGHqDAS8YtwqOGAOIGtKb8eILxXLFj8ZImkWGdnKiqbC1n8epnR/77ph mq0o6VHKr7u+DiOZvGLN8HqpRRG5k4dWYXM77+3RPvMIAgPAhT0b3+Av+ZIkDMtNygin 7A9A== X-Gm-Message-State: AO0yUKW7Vh28DIPMjkEuBt6kpQbzMsjD/BLZnQH72YkXZCLZnFzon+ho V3eImbs211cAHY1kd8nwlB3iYJjtxSqMjHsiUU23eGYj/+rzOLVVsk/yNRKiEW8uqb97uLgoiwr oWU5eOwLMNNG8cUaYy3ePtZXHBlupM7/xZacfapve2z5QYvJOB+u4b5n4nIOrr+n8UpxY7PyAA7 g= X-Received: by 2002:a92:d1c5:0:b0:313:dfb9:ceb4 with SMTP id u5-20020a92d1c5000000b00313dfb9ceb4mr2641250ilg.8.1675778879050; Tue, 07 Feb 2023 06:07:59 -0800 (PST) X-Google-Smtp-Source: AK7set/hs13IfCij4eS1tzFruNPoGfDhtwg6pgDr0mgBegFNkvMjPIov/BzRw52lY6089EZYV05IMw== X-Received: by 2002:a92:d1c5:0:b0:313:dfb9:ceb4 with SMTP id u5-20020a92d1c5000000b00313dfb9ceb4mr2641236ilg.8.1675778878671; Tue, 07 Feb 2023 06:07:58 -0800 (PST) Received: from [192.168.1.104] (23-233-12-120.cpe.pppoe.ca. [23.233.12.120]) by smtp.gmail.com with ESMTPSA id p18-20020a92da52000000b00313e8fd977bsm241482ilq.62.2023.02.07.06.07.57 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 07 Feb 2023 06:07:57 -0800 (PST) Message-ID: <7ee31afa-d5c5-3d34-85e6-6034165876de@redhat.com> Date: Tue, 7 Feb 2023 09:07:56 -0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.0 To: "gcc-patches@gcc.gnu.org" Subject: [pushed] [PR103541] RA: Implement reuse of equivalent memory for caller saves optimization X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-Spam-Status: No, score=-11.9 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_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" The following patch solves https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103541 The patch was successfully bootstrapped and tested on x86-64, aarch64, and ppc64le. commit f661c0bb6371f355966a67b5ce71398e80792948 Author: Vladimir N. Makarov Date: Tue Feb 7 08:27:36 2023 -0500 RA: Implement reuse of equivalent memory for caller saves optimization The test case shows opportunity to reuse memory with constant address for caller saves optimization for constant or pure function call. The patch implements the memory reuse. PR rtl-optimization/103541 gcc/ChangeLog: * ira.h (struct ira_reg_equiv_s): Add new field caller_save_p. * ira.cc (validate_equiv_mem): Check memref address variance. (update_equiv_regs): Define caller save equivalence for valid_combine. (setup_reg_equiv): Clear defined_p flag for caller save equivalence. * lra-constraints.cc (lra_copy_reg_equiv): Add new arg call_save_p. Use caller save equivalence depending on the arg. (split_reg): Adjust the call. gcc/testsuite/ChangeLog: * gcc.target/i386/pr103541.c: New. diff --git a/gcc/ira.cc b/gcc/ira.cc index 66df03e8a59..c6ee46286bc 100644 --- a/gcc/ira.cc +++ b/gcc/ira.cc @@ -3070,6 +3070,8 @@ validate_equiv_mem_from_store (rtx dest, const_rtx set ATTRIBUTE_UNUSED, info->equiv_mem_modified = true; } +static int equiv_init_varies_p (rtx x); + enum valid_equiv { valid_none, valid_combine, valid_reload }; /* Verify that no store between START and the death of REG invalidates @@ -3113,7 +3115,8 @@ validate_equiv_mem (rtx_insn *start, rtx reg, rtx memref) been changed and all hell breaks loose. */ ret = valid_combine; if (!MEM_READONLY_P (memref) - && !RTL_CONST_OR_PURE_CALL_P (insn)) + && (!RTL_CONST_OR_PURE_CALL_P (insn) + || equiv_init_varies_p (XEXP (memref, 0)))) return valid_none; } @@ -3766,7 +3769,18 @@ update_equiv_regs (void) { replacement = copy_rtx (SET_SRC (set)); if (validity == valid_reload) - note = set_unique_reg_note (insn, REG_EQUIV, replacement); + { + note = set_unique_reg_note (insn, REG_EQUIV, replacement); + } + else + { + /* We still can use this equivalence for caller save + optimization in LRA. Mark this. */ + ira_reg_equiv[regno].caller_save_p = true; + ira_reg_equiv[regno].init_insns + = gen_rtx_INSN_LIST (VOIDmode, insn, + ira_reg_equiv[regno].init_insns); + } } } @@ -4156,7 +4170,7 @@ setup_reg_equiv (void) legitimate, we ignore such REG_EQUIV notes. */ if (memory_operand (x, VOIDmode)) { - ira_reg_equiv[i].defined_p = true; + ira_reg_equiv[i].defined_p = !ira_reg_equiv[i].caller_save_p; ira_reg_equiv[i].memory = x; continue; } diff --git a/gcc/ira.h b/gcc/ira.h index 58b50dbe8a2..3d35025a46e 100644 --- a/gcc/ira.h +++ b/gcc/ira.h @@ -175,8 +175,11 @@ extern struct target_ira *this_target_ira; /* Major structure describing equivalence info for a pseudo. */ struct ira_reg_equiv_s { - /* True if we can use this equivalence. */ + /* True if we can use this as a general equivalence. */ bool defined_p; + /* True if we can use this equivalence only for caller save/restore + location. */ + bool caller_save_p; /* True if the usage of the equivalence is profitable. */ bool profitable_p; /* Equiv. memory, constant, invariant, and initializing insns of diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc index 7bffbc07ee2..dd4f68bbfc0 100644 --- a/gcc/lra-constraints.cc +++ b/gcc/lra-constraints.cc @@ -5771,14 +5771,17 @@ choose_split_class (enum reg_class allocno_class, return best_cl; } -/* Copy any equivalence information from ORIGINAL_REGNO to NEW_REGNO. - It only makes sense to call this function if NEW_REGNO is always - equal to ORIGINAL_REGNO. */ +/* Copy any equivalence information from ORIGINAL_REGNO to NEW_REGNO. It only + makes sense to call this function if NEW_REGNO is always equal to + ORIGINAL_REGNO. Set up defined_p flag when caller_save_p flag is set up and + CALL_SAVE_P is true. */ static void -lra_copy_reg_equiv (unsigned int new_regno, unsigned int original_regno) +lra_copy_reg_equiv (unsigned int new_regno, unsigned int original_regno, + bool call_save_p) { - if (!ira_reg_equiv[original_regno].defined_p) + if (!ira_reg_equiv[original_regno].defined_p + && !(call_save_p && ira_reg_equiv[original_regno].caller_save_p)) return; ira_expand_reg_equiv (); @@ -5958,7 +5961,7 @@ split_reg (bool before_p, int original_regno, rtx_insn *insn, rematerializing the original value instead of spilling to the stack. */ if (!HARD_REGISTER_NUM_P (original_regno) && mode == PSEUDO_REGNO_MODE (original_regno)) - lra_copy_reg_equiv (new_regno, original_regno); + lra_copy_reg_equiv (new_regno, original_regno, call_save_p); lra_reg_info[new_regno].restore_rtx = regno_reg_rtx[original_regno]; bitmap_set_bit (&lra_split_regs, new_regno); if (to != NULL) diff --git a/gcc/testsuite/gcc.target/i386/pr103541.c b/gcc/testsuite/gcc.target/i386/pr103541.c new file mode 100644 index 00000000000..72b257d42ee --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr103541.c @@ -0,0 +1,14 @@ +/* PR rtl-optimization/103541 */ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-O2" } */ + +float a; +__attribute__((const)) float foo (float); + +float +test() +{ + return a + foo(a) + a; +} + +/* { dg-final { scan-assembler-not "\\\(%rsp\\\)" } } */