public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [pushed] [RA] [PR110215] Ignore conflicts for some pseudos from insns throwing a final exception
@ 2023-06-16 15:18 Vladimir Makarov
  0 siblings, 0 replies; only message in thread
From: Vladimir Makarov @ 2023-06-16 15:18 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 256 bytes --]

The following patch solves

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110215

The patch was successfully tested and bootstrapped on x86-64, aarch64, 
and ppc64le.

It is difficult to make a stable test for the PR.  So there is not test 
in the patch.


[-- Attachment #2: pr110215.patch --]
[-- Type: text/x-patch, Size: 2579 bytes --]

commit 154c69039571c66b3a6d16ecfa9e6ff22942f59f
Author: Vladimir N. Makarov <vmakarov@redhat.com>
Date:   Fri Jun 16 11:12:32 2023 -0400

    RA: Ignore conflicts for some pseudos from insns throwing a final exception
    
    IRA adds conflicts to the pseudos from insns can throw exceptions
    internally even if the exception code is final for the function and
    the pseudo value is not used in the exception code.  This results in
    spilling a pseudo in a loop (see
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110215).
    
    The following patch fixes the problem.
    
            PR rtl-optimization/110215
    
    gcc/ChangeLog:
    
            * ira-lives.cc: Include except.h.
            (process_bb_node_lives): Ignore conflicts from cleanup exceptions
            when the pseudo does not live at the exception landing pad.

diff --git a/gcc/ira-lives.cc b/gcc/ira-lives.cc
index 6a3901ee234..bc8493856a4 100644
--- a/gcc/ira-lives.cc
+++ b/gcc/ira-lives.cc
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "ira-int.h"
 #include "sparseset.h"
 #include "function-abi.h"
+#include "except.h"
 
 /* The code in this file is similar to one in global but the code
    works on the allocno basis and creates live ranges instead of
@@ -1383,14 +1384,24 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
 		      SET_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj));
 		      SET_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
 		    }
-		  if (can_throw_internal (insn))
+		  eh_region r;
+		  eh_landing_pad lp;
+		  rtx_code_label *landing_label;
+		  basic_block landing_bb;
+		  if (can_throw_internal (insn)
+		      && (r = get_eh_region_from_rtx (insn)) != NULL
+		      && (lp = gen_eh_landing_pad (r)) != NULL
+		      && (landing_label = lp->landing_pad) != NULL
+		      && (landing_bb = BLOCK_FOR_INSN (landing_label)) != NULL
+		      && (r->type != ERT_CLEANUP
+			  || bitmap_bit_p (df_get_live_in (landing_bb),
+					   ALLOCNO_REGNO (a))))
 		    {
-		      OBJECT_CONFLICT_HARD_REGS (obj)
-			|= callee_abi.mode_clobbers (ALLOCNO_MODE (a));
-		      OBJECT_TOTAL_CONFLICT_HARD_REGS (obj)
-			|= callee_abi.mode_clobbers (ALLOCNO_MODE (a));
+		      HARD_REG_SET new_conflict_regs
+			= callee_abi.mode_clobbers (ALLOCNO_MODE (a));
+		      OBJECT_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
+		      OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
 		    }
-
 		  if (sparseset_bit_p (allocnos_processed, num))
 		    continue;
 		  sparseset_set_bit (allocnos_processed, num);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-06-16 15:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-16 15:18 [pushed] [RA] [PR110215] Ignore conflicts for some pseudos from insns throwing a final exception Vladimir Makarov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).