From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1130) id 39B48393600A; Tue, 11 Jan 2022 19:25:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 39B48393600A MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Sandiford To: gcc-cvs@gcc.gnu.org Subject: [gcc r12-6490] ira: Fix old-reload targets [PR103974] X-Act-Checkin: gcc X-Git-Author: Richard Sandiford X-Git-Refname: refs/heads/master X-Git-Oldrev: 8b35f02ed599a70cce752e3cb544a7c9f808fce8 X-Git-Newrev: db8d94a0570dc1f3de10c9eb9fe6e91df804272b Message-Id: <20220111192509.39B48393600A@sourceware.org> Date: Tue, 11 Jan 2022 19:25:09 +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, 11 Jan 2022 19:25:09 -0000 https://gcc.gnu.org/g:db8d94a0570dc1f3de10c9eb9fe6e91df804272b commit r12-6490-gdb8d94a0570dc1f3de10c9eb9fe6e91df804272b Author: Richard Sandiford Date: Tue Jan 11 19:24:59 2022 +0000 ira: Fix old-reload targets [PR103974] The new IRA heuristics would need more work on old-reload targets, since flattening needs to be able to undo the cost propagation. It's doable, but hardly seems worth it. This patch therefore makes all the new calls to ira_subloop_allocnos_can_differ_p return false if !ira_use_lra_p. The color_pass code that predated the new function (and that was the source of ira_subloop_allocnos_can_differ_p) continues to behave as before. It's a hack, but at least it has the advantage that the new parameter would become obviously unused if reload and (!)ira_use_lra_p were removed. The hack should therefore disappear alongside reload. gcc/ PR rtl-optimization/103974 * ira-int.h (ira_subloop_allocnos_can_differ_p): Take an extra argument, default true, that says whether old-reload targets should be excluded. * ira-color.c (color_pass): Pass false. Diff: --- gcc/ira-color.c | 3 ++- gcc/ira-int.h | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/gcc/ira-color.c b/gcc/ira-color.c index 36f3f4d70f3..59d978fe9b3 100644 --- a/gcc/ira-color.c +++ b/gcc/ira-color.c @@ -3664,7 +3664,8 @@ color_pass (ira_loop_tree_node_t loop_tree_node) ira_assert (bitmap_bit_p (subloop_node->all_allocnos, ALLOCNO_NUM (subloop_allocno))); if (ira_single_region_allocno_p (a, subloop_allocno) - || !ira_subloop_allocnos_can_differ_p (a, hard_regno >= 0)) + || !ira_subloop_allocnos_can_differ_p (a, hard_regno >= 0, + false)) { gcc_assert (!ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P (subloop_allocno)); diff --git a/gcc/ira-int.h b/gcc/ira-int.h index e1e68025211..e80fdeb0328 100644 --- a/gcc/ira-int.h +++ b/gcc/ira-int.h @@ -1607,10 +1607,16 @@ ira_loop_border_costs::move_between_loops_cost () const /* Return true if subloops that contain allocnos for A's register can use a different assignment from A. ALLOCATED_P is true for the case - in which allocation succeeded for A. */ + in which allocation succeeded for A. EXCLUDE_OLD_RELOAD is true if + we should always return false for non-LRA targets. (This is a hack + and should be removed along with old reload.) */ inline bool -ira_subloop_allocnos_can_differ_p (ira_allocno_t a, bool allocated_p = true) +ira_subloop_allocnos_can_differ_p (ira_allocno_t a, bool allocated_p = true, + bool exclude_old_reload = true) { + if (exclude_old_reload && !ira_use_lra_p) + return false; + auto regno = ALLOCNO_REGNO (a); if (pic_offset_table_rtx != NULL