diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-09-23 17:41:02 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2013-09-23 17:41:02 +0000 |
commit | e5af9ddd011d07b38554d4f794470082ce5b13e6 (patch) | |
tree | f0f02b81672861af134a5f088d252ccd973c596f /gcc/ifcvt.c | |
parent | 450ad0cd441aa2da250c2ca84e8005cb3a2d38e3 (diff) | |
download | gcc-e5af9ddd011d07b38554d4f794470082ce5b13e6.zip gcc-e5af9ddd011d07b38554d4f794470082ce5b13e6.tar.gz gcc-e5af9ddd011d07b38554d4f794470082ce5b13e6.tar.bz2 |
rtl.texi (REG_NOTES): Say that int_list can also be used.
gcc/
* doc/rtl.texi (REG_NOTES): Say that int_list can also be used.
(REG_BR_PROB): Say that the probability is stored in an int_list.
* reg-notes.def: Update commentary to mention INT_LIST.
* rtl.def (EXPR_LIST, INSN_LIST): Capitalize comments.
(INT_LIST): New rtx.
* rtl.h (add_int_reg_note, add_shallow_copy_of_reg_note): Declare.
* rtlanal.c (int_reg_note_p): New function.
(alloc_reg_note): Assert that the note does not have an int argument.
(add_int_reg_note, add_shallow_copy_of_reg_note): New functions.
* combine.c (distribute_notes): Use add_shallow_copy_of_rtx.
* cse.c (cse_process_notes_1): Expect REG_EQUAL to be an EXPR_LIST
rather than an INSN_LIST. Handle INT_LIST.
* ifcvt.c (cond_exec_process_insns): Take the probability as an int
rather than an rtx. Use gen_rtx_INT_LIST to create a REG_BR_PROB note.
(cond_exec_process_if_block): Use XINT to extract REG_BR_PROB values.
Manipulate them as ints rather than rtxes.
* reg-stack.c (subst_asm_stack_regs): Only handle EXPR_LIST notes.
* regmove.c (copy_src_to_dest): Likewise.
* sched-vis.c (print_insn_with_notes): Handle INT_LIST.
* config/i386/winnt.c (i386_pe_seh_unwind_emit): Sink pat assignment
into the cases that need it.
* config/arm/arm.c (arm_unwind_emit): Likewise.
* asan.c (asan_clear_shadow): Use add_int_reg_note for REG_BR_PROB.
* emit-rtl.c (try_split, emit_copy_of_insn_after): Likewise.
* loop-doloop.c (add_test, doloop_modify): Likewise.
* loop-unswitch.c (compare_and_jump_seq): Likewise.
* optabs.c (emit_cmp_and_jump_insn_1): Likewise.
* predict.c (combine_predictions_for_insn): Likewise.
* print-rtl.c (print_rtx): Handle INT_LIST.
* config/aarch64/aarch64.c (aarch64_emit_unlikely_jump): Likewise.
* config/alpha/alpha.c (emit_unlikely_jump): Likewise.
* config/arm/arm.c (emit_unlikely_jump): Likewise.
* config/i386/i386.c (ix86_expand_split_stack_prologue): Likewise.
(ix86_split_fp_branch, predict_jump): Likewise.
* config/rs6000/rs6000.c (emit_unlikely_jump): Likewise.
* config/sh/sh.c (expand_cbranchsi4): Likewise.
* config/spu/spu.c (ea_load_store_inline): Likewise.
* cfgbuild.c (compute_outgoing_frequencies): Use XINT to access the
value of a REG_BR_PROB note.
* cfgrtl.c (force_nonfallthru_and_redirect): Likewise.
(update_br_prob_note, rtl_verify_edges, purge_dead_edges): Likewise.
* emit-rtl.c (try_split): Likewise.
* predict.c (br_prob_note_reliable_p): Likewise.
(invert_br_probabilities, combine_predictions_for_insn): Likewise.
* reorg.c (mostly_true_jump): Likewise.
* config/bfin/bfin.c (cbranch_predicted_taken_p): Likewise.
* config/frv/frv.c (frv_print_operand_jump_hint): Likewise.
* config/i386/i386.c (ix86_print_operand): Likewise.
* config/ia64/ia64.c (ia64_print_operand): Likewise.
* config/mmix/mmix.c (mmix_print_operand): Likewise.
* config/rs6000/rs6000.c (output_cbranch): Likewise.
* config/s390/s390.c (s390_expand_tbegin): Likewise.
* config/sh/sh.c (sh_print_operand, sh_adjust_cost): Likewise.
* config/sparc/sparc.c (output_cbranch): Likewise.
* config/spu/spu.c (get_branch_target): Likewise.
* config/tilegx/tilegx.c (cbranch_predicted_p): Likewise.
* config/tilepro/tilepro.c (cbranch_predicted_p): Likewise.
From-SVN: r202839
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index ebc4f1c..747fab9 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -91,7 +91,7 @@ static rtx last_active_insn (basic_block, int); static rtx find_active_insn_before (basic_block, rtx); static rtx find_active_insn_after (basic_block, rtx); static basic_block block_fallthru (basic_block); -static int cond_exec_process_insns (ce_if_block_t *, rtx, rtx, rtx, rtx, int); +static int cond_exec_process_insns (ce_if_block_t *, rtx, rtx, rtx, int, int); static rtx cond_exec_get_condition (rtx); static rtx noce_get_condition (rtx, rtx *, bool); static int noce_operand_ok (const_rtx); @@ -316,7 +316,7 @@ cond_exec_process_insns (ce_if_block_t *ce_info ATTRIBUTE_UNUSED, /* if block information */rtx start, /* first insn to look at */rtx end, /* last insn to look at */rtx test, - /* conditional execution test */rtx prob_val, + /* conditional execution test */int prob_val, /* probability of branch taken. */int mod_ok) { int must_be_last = FALSE; @@ -387,10 +387,10 @@ cond_exec_process_insns (ce_if_block_t *ce_info ATTRIBUTE_UNUSED, validate_change (insn, &PATTERN (insn), pattern, 1); - if (CALL_P (insn) && prob_val) + if (CALL_P (insn) && prob_val >= 0) validate_change (insn, ®_NOTES (insn), - alloc_EXPR_LIST (REG_BR_PROB, prob_val, - REG_NOTES (insn)), 1); + gen_rtx_INT_LIST ((enum machine_mode) REG_BR_PROB, + prob_val, REG_NOTES (insn)), 1); insn_done: if (insn == end) @@ -449,14 +449,15 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, int then_mod_ok; /* whether conditional mods are ok in THEN */ rtx true_expr; /* test for else block insns */ rtx false_expr; /* test for then block insns */ - rtx true_prob_val; /* probability of else block */ - rtx false_prob_val; /* probability of then block */ + int true_prob_val; /* probability of else block */ + int false_prob_val; /* probability of then block */ rtx then_last_head = NULL_RTX; /* Last match at the head of THEN */ rtx else_last_head = NULL_RTX; /* Last match at the head of ELSE */ rtx then_first_tail = NULL_RTX; /* First match at the tail of THEN */ rtx else_first_tail = NULL_RTX; /* First match at the tail of ELSE */ int then_n_insns, else_n_insns, n_insns; enum rtx_code false_code; + rtx note; /* If test is comprised of && or || elements, and we've failed at handling all of them together, just use the last test if it is the special case of @@ -588,14 +589,17 @@ cond_exec_process_if_block (ce_if_block_t * ce_info, goto fail; #endif - true_prob_val = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX); - if (true_prob_val) + note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX); + if (note) { - true_prob_val = XEXP (true_prob_val, 0); - false_prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (true_prob_val)); + true_prob_val = XINT (note, 0); + false_prob_val = REG_BR_PROB_BASE - true_prob_val; } else - false_prob_val = NULL_RTX; + { + true_prob_val = -1; + false_prob_val = -1; + } /* If we have && or || tests, do them here. These tests are in the adjacent blocks after the first block containing the test. */ @@ -4113,15 +4117,14 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, All that's left is making sure the insns involved can actually be predicated. */ - rtx cond, prob_val; + rtx cond; cond = cond_exec_get_condition (jump); if (! cond) return FALSE; - prob_val = find_reg_note (jump, REG_BR_PROB, NULL_RTX); - if (prob_val) - prob_val = XEXP (prob_val, 0); + rtx note = find_reg_note (jump, REG_BR_PROB, NULL_RTX); + int prob_val = (note ? XINT (note, 0) : -1); if (reversep) { @@ -4130,8 +4133,8 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb, return FALSE; cond = gen_rtx_fmt_ee (rev, GET_MODE (cond), XEXP (cond, 0), XEXP (cond, 1)); - if (prob_val) - prob_val = GEN_INT (REG_BR_PROB_BASE - INTVAL (prob_val)); + if (prob_val >= 0) + prob_val = REG_BR_PROB_BASE - prob_val; } if (cond_exec_process_insns (NULL, head, end, cond, prob_val, 0) |