git diff trunk casesi -- diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 1f222ae..39fc7aa 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1214,10 +1214,7 @@ patch_jump_insn (rtx_insn *insn, rtx_insn *old_label, basic_block new_bb) } /* Handle casesi dispatch insns. */ - if ((tmp = single_set (insn)) != NULL - && SET_DEST (tmp) == pc_rtx - && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE - && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF + if ((tmp = tablejump_casesi_pattern (insn)) != NULL_RTX && label_ref_label (XEXP (SET_SRC (tmp), 2)) == old_label) { XEXP (SET_SRC (tmp), 2) = gen_rtx_LABEL_REF (Pmode, diff --git a/gcc/dwarf2cfi.c b/gcc/dwarf2cfi.c index d6aed35..95ba0f7 100644 --- a/gcc/dwarf2cfi.c +++ b/gcc/dwarf2cfi.c @@ -2445,6 +2445,13 @@ create_trace_edges (rtx_insn *insn) rtx_insn *lab = as_a (XEXP (RTVEC_ELT (vec, i), 0)); maybe_record_trace_start (lab, insn); } + + /* Handle casesi dispatch insns. */ + if ((tmp = tablejump_casesi_pattern (insn)) != NULL_RTX) + { + rtx_insn * lab = label_ref_label (XEXP (SET_SRC (tmp), 2)); + maybe_record_trace_start (lab, insn); + } } else if (computed_jump_p (insn)) { diff --git a/gcc/rtl.h b/gcc/rtl.h index 039ab05..244daea 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -3632,6 +3632,22 @@ extern GTY(()) rtx ret_rtx; extern GTY(()) rtx simple_return_rtx; extern GTY(()) rtx_insn *invalid_insn_rtx; +/* For INSN known to satisfy tablejump_p, determine if it actually is a + CASESI. Return the insn pattern if so, NULL_RTX otherwise. */ + +inline rtx tablejump_casesi_pattern (const rtx_insn *insn) +{ + rtx tmp; + + if ((tmp = single_set (insn)) != NULL + && SET_DEST (tmp) == pc_rtx + && GET_CODE (SET_SRC (tmp)) == IF_THEN_ELSE + && GET_CODE (XEXP (SET_SRC (tmp), 2)) == LABEL_REF) + return tmp; + + return NULL_RTX; +} + /* If HARD_FRAME_POINTER_REGNUM is defined, then a special dummy reg is used to represent the frame pointer. This is because the hard frame pointer and the automatic variables are separated by an amount