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 <rtx_insn *> (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
