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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
copy_reg_eh_region_note_forward is called with note_or_insn being
(note 19 18 20 3 [bb 3] NOTE_INSN_BASIC_BLOCK)
and because it is not INSN_P, it assumes it must be a REG_EH_REGION note and
uses XEXP (note_or_insn, 0) on it and happily creates
(expr_list:REG_EH_REGION (jump_insn 18 17 19 2 (set (pc)
            (if_then_else (ne (reg:CC 68 0 [130])
                    (const_int 0 [0]))
                (label_ref 24)
                (pc))) "pr89234.c":7:6 761 {*cbranch}
         (int_list:REG_BR_PROB 1073204964 (nil))
     -> 24)
    (nil))

--- gcc/except.c.jj     2019-01-10 11:43:14.387377695 +0100
+++ gcc/except.c        2019-02-07 15:11:27.756869475 +0100
@@ -1756,6 +1756,8 @@ copy_reg_eh_region_note_forward (rtx not
       if (note == NULL)
        return;
     }
+  else if (is_a <rtx_insn *> (note_or_insn))
+    return;
   note = XEXP (note, 0);

   for (insn = first; insn != last ; insn = NEXT_INSN (insn))

should fix the ICE, or LRA would need to be tweaked to make sure it never calls
it with NOTEs and other non-INSN_P rtx_insns.

Reply via email to