From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7810) id AD9A7385841B; Thu, 19 Oct 2023 10:14:59 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AD9A7385841B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1697710499; bh=LvXguxzlnVf1aNug9OJvtxQ6khiOXiZi74PzH917QCM=; h=From:To:Subject:Date:From; b=jwVqoHusVOgx/uI4q718QZMTaeUFS6L5nO62p+aDccVk+UE4grvSrRYOfRDD+Aip3 lkdzx/PmSbSOXkO1R6nhtjDVHHt5dF3W2jrz7VFZDvyGKso1eCo7+VY+zS++2QzY2N TVEESrL0Zht5MRLDWTesbQJNvT5qyNPGxXD04PWQ= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Alex Coplan To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-4739] rtl-ssa: Support inferring uses of mem in change_insns X-Act-Checkin: gcc X-Git-Author: Alex Coplan X-Git-Refname: refs/heads/master X-Git-Oldrev: ba230aa1b855c32d5414183b604e45ce836fb532 X-Git-Newrev: 505f1202e3a1a1aecd0df10d0f1620df6fea4ab5 Message-Id: <20231019101459.AD9A7385841B@sourceware.org> Date: Thu, 19 Oct 2023 10:14:59 +0000 (GMT) List-Id: https://gcc.gnu.org/g:505f1202e3a1a1aecd0df10d0f1620df6fea4ab5 commit r14-4739-g505f1202e3a1a1aecd0df10d0f1620df6fea4ab5 Author: Alex Coplan Date: Mon Oct 16 14:14:40 2023 +0000 rtl-ssa: Support inferring uses of mem in change_insns Currently, rtl_ssa::change_insns requires all new uses and defs to be specified explicitly. This turns out to be rather inconvenient for forming load pairs in the new aarch64 load pair pass, as the pass has to determine which mem def the final load pair consumes, and then obtain or create a suitable use (i.e. significant bookkeeping, just to keep the RTL-SSA IR consistent). It turns out to be much more convenient to allow change_insns to infer which def is consumed and create a suitable use of mem itself. This patch does that. gcc/ChangeLog: * rtl-ssa/changes.cc (function_info::finalize_new_accesses): Add new parameter to give final insn position, infer use of mem if it isn't specified explicitly. (function_info::change_insns): Pass down final insn position to finalize_new_accesses. * rtl-ssa/functions.h: Add parameter to finalize_new_accesses. Diff: --- gcc/rtl-ssa/changes.cc | 31 ++++++++++++++++++++++++++++--- gcc/rtl-ssa/functions.h | 2 +- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gcc/rtl-ssa/changes.cc b/gcc/rtl-ssa/changes.cc index c48ddd2463cd..523ad60d7d89 100644 --- a/gcc/rtl-ssa/changes.cc +++ b/gcc/rtl-ssa/changes.cc @@ -370,8 +370,11 @@ update_insn_in_place (insn_change &change) // Finalize the new list of definitions and uses in CHANGE, removing // any uses and definitions that are no longer needed, and converting // pending clobbers into actual definitions. +// +// POS gives the final position of INSN, which hasn't yet been moved into +// place. void -function_info::finalize_new_accesses (insn_change &change) +function_info::finalize_new_accesses (insn_change &change, insn_info *pos) { insn_info *insn = change.insn (); @@ -462,13 +465,34 @@ function_info::finalize_new_accesses (insn_change &change) // Add (possibly temporary) uses to m_temp_uses for each resource. // If there are multiple references to the same resource, aggregate // information in the modes and flags. + use_info *mem_use = nullptr; for (rtx_obj_reference ref : properties.refs ()) if (ref.is_read ()) { unsigned int regno = ref.regno; machine_mode mode = ref.is_reg () ? ref.mode : BLKmode; use_info *use = find_access (unshared_uses, ref.regno); - gcc_assert (use); + if (!use) + { + // For now, we only support inferring uses of mem. + gcc_assert (regno == MEM_REGNO); + + if (mem_use) + { + mem_use->record_reference (ref, false); + continue; + } + + resource_info resource { mode, regno }; + auto def = find_def (resource, pos).prev_def (pos); + auto set = safe_dyn_cast (def); + gcc_assert (set); + mem_use = allocate (insn, resource, set); + mem_use->record_reference (ref, true); + m_temp_uses.safe_push (mem_use); + continue; + } + if (use->m_has_been_superceded) { // This is the first reference to the resource. @@ -656,7 +680,8 @@ function_info::change_insns (array_slice changes) // Finalize the new list of accesses for the change. Don't install // them yet, so that we still have access to the old lists below. - finalize_new_accesses (change); + finalize_new_accesses (change, + placeholder ? placeholder : insn); } placeholders[i] = placeholder; } diff --git a/gcc/rtl-ssa/functions.h b/gcc/rtl-ssa/functions.h index d7da9774213c..73690a0e63b4 100644 --- a/gcc/rtl-ssa/functions.h +++ b/gcc/rtl-ssa/functions.h @@ -265,7 +265,7 @@ private: insn_info *add_placeholder_after (insn_info *); void possibly_queue_changes (insn_change &); - void finalize_new_accesses (insn_change &); + void finalize_new_accesses (insn_change &, insn_info *); void apply_changes_to_insn (insn_change &); void init_function_data ();