[PR97847] IRA: Skip abnormal critical edge splitting
authorVladimir N. Makarov <vmakarov@redhat.com>
Mon, 18 Jan 2021 21:41:39 +0000 (16:41 -0500)
committerVladimir N. Makarov <vmakarov@redhat.com>
Mon, 18 Jan 2021 21:47:15 +0000 (16:47 -0500)
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.

gcc/ira.c

index 725b0ff0276c1c85f713bf8fef4709aeda1e4958..f0bdbc8cf56104ab99987c7c883d1dd2f0291b63 100644 (file)
--- 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