static void test_uncond_jump () { rtx_insn *label = gen_label_rtx (); rtx jump_pat = gen_rtx_SET (pc_rtx, gen_rtx_LABEL_REF (VOIDmode, label)); ASSERT_EQ (SET, jump_pat->code); ASSERT_EQ (LABEL_REF, SET_SRC (jump_pat)->code); ASSERT_EQ (label, label_ref_label (SET_SRC (jump_pat))); ASSERT_EQ (PC, SET_DEST (jump_pat)->code); verify_print_pattern ("pc=L0", jump_pat); ASSERT_RTL_DUMP_EQ ("(set (pc)\n" " (label_ref 0))", jump_pat); rtx_insn *jump_insn = emit_jump_insn (jump_pat); ASSERT_FALSE (any_condjump_p (jump_insn)); ASSERT_TRUE (any_uncondjump_p (jump_insn)); ASSERT_TRUE (pc_set (jump_insn)); ASSERT_TRUE (simplejump_p (jump_insn)); ASSERT_TRUE (onlyjump_p (jump_insn)); ASSERT_TRUE (control_flow_insn_p (jump_insn)); ASSERT_RTL_DUMP_EQ ("(cjump_insn 1 (set (pc)\n" " (label_ref 0)))\n", jump_insn); }
/* Verify that there is exactly single jump instruction since last and attach REG_BR_PROB note specifying probability. ??? We really ought to pass the probability down to RTL expanders and let it re-distribute it when the conditional expands into multiple conditionals. This is however difficult to do. */ static void add_reg_br_prob_note (FILE *dump_file, rtx last, int probability) { if (profile_status == PROFILE_ABSENT) return; for (last = NEXT_INSN (last); last && NEXT_INSN (last); last = NEXT_INSN (last)) if (GET_CODE (last) == JUMP_INSN) { /* It is common to emit condjump-around-jump sequence when we don't know how to reverse the conditional. Special case this. */ if (!any_condjump_p (last) || GET_CODE (NEXT_INSN (last)) != JUMP_INSN || !simplejump_p (NEXT_INSN (last)) || GET_CODE (NEXT_INSN (NEXT_INSN (last))) != BARRIER || GET_CODE (NEXT_INSN (NEXT_INSN (NEXT_INSN (last)))) != CODE_LABEL || NEXT_INSN (NEXT_INSN (NEXT_INSN (NEXT_INSN (last))))) goto failed; if (find_reg_note (last, REG_BR_PROB, 0)) abort (); REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (REG_BR_PROB_BASE - probability), REG_NOTES (last)); return; } if (!last || GET_CODE (last) != JUMP_INSN || !any_condjump_p (last)) goto failed; if (find_reg_note (last, REG_BR_PROB, 0)) abort (); REG_NOTES (last) = gen_rtx_EXPR_LIST (REG_BR_PROB, GEN_INT (probability), REG_NOTES (last)); return; failed: if (dump_file) fprintf (dump_file, "Failed to add probability note\n"); }