diff mbox series

[committed] IRA: patch to fix PR97847

Message ID d6e5412f-d288-9d31-e3d8-4a1164c55254@redhat.com
State New
Headers show
Series [committed] IRA: patch to fix PR97847 | expand

Commit Message

Vladimir Makarov Jan. 18, 2021, 9:48 p.m. UTC
The following patch fixes

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

The patch was successfully bootstrapped and tested on x86-64 and ppc64.
diff mbox series

Patch

[PR97847] IRA: Skip abnormal critical edge splitting

PPC64 can generate jumps with clobbered pseudo-regs and a BB with
such jump can have abnormal output edges.  IRA hits an assert when trying
to split abnormal critical edge to deal with asm goto output reloads
later.  The patch just skips splitting abnormal edges.  It is assumed
that asm-goto with output reloads can not be in BB with output abnormal edges.

gcc/ChangeLog:

	PR target/97847
	* ira.c (ira): Skip abnormal critical edge splitting.

diff --git a/gcc/ira.c b/gcc/ira.c
index 725b0ff0276..f0bdbc8cf56 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -5433,12 +5433,22 @@  ira (FILE *f)
 	  for (int i = 0; i < recog_data.n_operands; i++)
 	    if (recog_data.operand_type[i] != OP_IN)
 	      {
+		bool skip_p = false;
+		FOR_EACH_EDGE (e, ei, bb->succs)
+		  if (EDGE_CRITICAL_P (e)
+		      && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun)
+		      && (e->flags & EDGE_ABNORMAL))
+		    {
+		      skip_p = true;
+		      break;
+		    }
+		if (skip_p)
+		  break;
 		output_jump_reload_p = true;
 		FOR_EACH_EDGE (e, ei, bb->succs)
 		  if (EDGE_CRITICAL_P (e)
 		      && e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
 		    {
-		      ira_assert (!(e->flags & EDGE_ABNORMAL));
 		      start_sequence ();
 		      /* We need to put some no-op insn here.  We can
 			 not put a note as commit_edges insertion will