diff options
author | Jan Hubicka <jh@suse.cz> | 2008-08-30 16:19:01 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2008-08-30 14:19:01 +0000 |
commit | 3a4fd356e0e9cda6a66a3a0af9ecb6600669265c (patch) | |
tree | 4339e3edb706d886f8df2cbbc9a8fe530f969a60 /gcc/ifcvt.c | |
parent | b1bdaf4061096a0e4d4259acbf27cf97542ea9de (diff) | |
download | gcc-3a4fd356e0e9cda6a66a3a0af9ecb6600669265c.zip gcc-3a4fd356e0e9cda6a66a3a0af9ecb6600669265c.tar.gz gcc-3a4fd356e0e9cda6a66a3a0af9ecb6600669265c.tar.bz2 |
optabs.c (expand_abs_nojump): Update BRANCH_COST call.
* optabs.c (expand_abs_nojump): Update BRANCH_COST call.
* fold-cost.c (LOGICAL_OP_NON_SHORT_CIRCUIT, fold_truthop): Likewise.
* dojump.c (do_jump): Likewise.
* ifcvt.c (MAX_CONDITIONAL_EXECUTE): Likewise.
(note-if_info): Add BRANCH_COST.
(noce_try_store_flag_constants, noce_try_addcc, noce_try_store_flag_mask,
noce_try_cmove_arith, noce_try_cmove_arith, noce_try_cmove_arith,
noce_find_if_block, find_if_case_1, find_if_case_2): Use compuated
branch cost.
* expr.h (BRANCH_COST): Update default.
* predict.c (predictable_edge_p): New function.
* expmed.c (expand_smod_pow2, expand_sdiv_pow2, emit_store_flag):
Update BRANCH_COST call.
* basic-block.h (predictable_edge_p): Declare.
* config/alpha/alpha.h (BRANCH_COST): Update.
* config/frv/frv.h (BRANCH_COST): Update.
* config/s390/s390.h (BRANCH_COST): Update.
* config/spu/spu.h (BRANCH_COST): Update.
* config/sparc/sparc.h (BRANCH_COST): Update.
* config/m32r/m32r.h (BRANCH_COST): Update.
* config/i386/i386.h (BRANCH_COST): Update.
* config/i386/i386.c (ix86_expand_int_movcc): Update use of BRANCH_COST.
* config/sh/sh.h (BRANCH_COST): Update.
* config/pdp11/pdp11.h (BRANCH_COST): Update.
* config/avr/avr.h (BRANCH_COST): Update.
* config/crx/crx.h (BRANCH_COST): Update.
* config/xtensa/xtensa.h (BRANCH_COST): Update.
* config/stormy16/stormy16.h (BRANCH_COST): Update.
* config/m68hc11/m68hc11.h (BRANCH_COST): Update.
* config/iq2000/iq2000.h (BRANCH_COST): Update.
* config/ia64/ia64.h (BRANCH_COST): Update.
* config/rs6000/rs6000.h (BRANCH_COST): Update.
* config/arc/arc.h (BRANCH_COST): Update.
* config/score/score.h (BRANCH_COST): Update.
* config/arm/arm.h (BRANCH_COST): Update.
* config/pa/pa.h (BRANCH_COST): Update.
* config/mips/mips.h (BRANCH_COST): Update.
* config/vax/vax.h (BRANCH_COST): Update.
* config/h8300/h8300.h (BRANCH_COST): Update.
* params.def (PARAM_PREDICTABLE_BRANCH_OUTCOME): New.
* doc/invoke.texi (predictable-branch-cost-outcome): Document.
* doc/tm.texi (BRANCH_COST): Update.
From-SVN: r139804
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index da8afde..51fc48c 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -67,7 +67,9 @@ #endif #ifndef MAX_CONDITIONAL_EXECUTE -#define MAX_CONDITIONAL_EXECUTE (BRANCH_COST + 1) +#define MAX_CONDITIONAL_EXECUTE \ + (BRANCH_COST (optimize_function_for_speed_p (cfun), false) \ + + 1) #endif #define IFCVT_MULTIPLE_DUMPS 1 @@ -626,6 +628,9 @@ struct noce_if_info from TEST_BB. For the noce transformations, we allow the symmetric form as well. */ bool then_else_reversed; + + /* Estimated cost of the particular branch instruction. */ + int branch_cost; }; static rtx noce_emit_store_flag (struct noce_if_info *, rtx, int, int); @@ -963,20 +968,20 @@ noce_try_store_flag_constants (struct noce_if_info *if_info) normalize = 0; else if (ifalse == 0 && exact_log2 (itrue) >= 0 && (STORE_FLAG_VALUE == 1 - || BRANCH_COST >= 2)) + || if_info->branch_cost >= 2)) normalize = 1; else if (itrue == 0 && exact_log2 (ifalse) >= 0 && can_reverse - && (STORE_FLAG_VALUE == 1 || BRANCH_COST >= 2)) + && (STORE_FLAG_VALUE == 1 || if_info->branch_cost >= 2)) normalize = 1, reversep = 1; else if (itrue == -1 && (STORE_FLAG_VALUE == -1 - || BRANCH_COST >= 2)) + || if_info->branch_cost >= 2)) normalize = -1; else if (ifalse == -1 && can_reverse - && (STORE_FLAG_VALUE == -1 || BRANCH_COST >= 2)) + && (STORE_FLAG_VALUE == -1 || if_info->branch_cost >= 2)) normalize = -1, reversep = 1; - else if ((BRANCH_COST >= 2 && STORE_FLAG_VALUE == -1) - || BRANCH_COST >= 3) + else if ((if_info->branch_cost >= 2 && STORE_FLAG_VALUE == -1) + || if_info->branch_cost >= 3) normalize = -1; else return FALSE; @@ -1107,7 +1112,7 @@ noce_try_addcc (struct noce_if_info *if_info) /* If that fails, construct conditional increment or decrement using setcc. */ - if (BRANCH_COST >= 2 + if (if_info->branch_cost >= 2 && (XEXP (if_info->a, 1) == const1_rtx || XEXP (if_info->a, 1) == constm1_rtx)) { @@ -1158,7 +1163,7 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) int reversep; reversep = 0; - if ((BRANCH_COST >= 2 + if ((if_info->branch_cost >= 2 || STORE_FLAG_VALUE == -1) && ((if_info->a == const0_rtx && rtx_equal_p (if_info->b, if_info->x)) @@ -1317,7 +1322,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info) /* ??? FIXME: Magic number 5. */ if (cse_not_expected && MEM_P (a) && MEM_P (b) - && BRANCH_COST >= 5) + && if_info->branch_cost >= 5) { a = XEXP (a, 0); b = XEXP (b, 0); @@ -1347,7 +1352,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info) if (insn_a) { insn_cost = insn_rtx_cost (PATTERN (insn_a)); - if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (BRANCH_COST)) + if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (if_info->branch_cost)) return FALSE; } else @@ -1356,7 +1361,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info) if (insn_b) { insn_cost += insn_rtx_cost (PATTERN (insn_b)); - if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (BRANCH_COST)) + if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (if_info->branch_cost)) return FALSE; } @@ -2831,6 +2836,8 @@ noce_find_if_block (basic_block test_bb, if_info.cond_earliest = cond_earliest; if_info.jump = jump; if_info.then_else_reversed = then_else_reversed; + if_info.branch_cost = BRANCH_COST (optimize_bb_for_speed_p (test_bb), + predictable_edge_p (then_edge)); /* Do the real work. */ @@ -3597,7 +3604,9 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge) test_bb->index, then_bb->index); /* THEN is small. */ - if (! cheap_bb_rtx_cost_p (then_bb, COSTS_N_INSNS (BRANCH_COST))) + if (! cheap_bb_rtx_cost_p (then_bb, + COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src), + predictable_edge_p (then_edge))))) return FALSE; /* Registers set are dead, or are predicable. */ @@ -3711,7 +3720,9 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge) test_bb->index, else_bb->index); /* ELSE is small. */ - if (! cheap_bb_rtx_cost_p (else_bb, COSTS_N_INSNS (BRANCH_COST))) + if (! cheap_bb_rtx_cost_p (else_bb, + COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src), + predictable_edge_p (else_edge))))) return FALSE; /* Registers set are dead, or are predicable. */ |