mirror of git://gcc.gnu.org/git/gcc.git
ifcvt.c (cheap_bb_rtx_cost_p): Add SCALE argument.
* ifcvt.c (cheap_bb_rtx_cost_p): Add SCALE argument. Scale non-jumping insns by REG_BR_PROB_BASE and the maximum cost by SCALE. (find_if_case_1): Use the probability of the THEN clause when determining if speculation is profitable. (find_if_case_2): Similarly for the ELSE clause. From-SVN: r179284
This commit is contained in:
parent
9b7ab6d6e0
commit
16a275d29d
|
@ -1,3 +1,12 @@
|
||||||
|
2011-09-27 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
|
* ifcvt.c (cheap_bb_rtx_cost_p): Add SCALE argument. Scale
|
||||||
|
non-jumping insns by REG_BR_PROB_BASE and the maximum cost
|
||||||
|
by SCALE.
|
||||||
|
(find_if_case_1): Use the probability of the THEN clause when
|
||||||
|
determining if speculation is profitable.
|
||||||
|
(find_if_case_2): Similarly for the ELSE clause.
|
||||||
|
|
||||||
2011-09-27 Jakub Jelinek <jakub@redhat.com>
|
2011-09-27 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
* common.opt: Add -foptimize-strlen option.
|
* common.opt: Add -foptimize-strlen option.
|
||||||
|
|
52
gcc/ifcvt.c
52
gcc/ifcvt.c
|
@ -85,7 +85,7 @@ static int cond_exec_changed_p;
|
||||||
|
|
||||||
/* Forward references. */
|
/* Forward references. */
|
||||||
static int count_bb_insns (const_basic_block);
|
static int count_bb_insns (const_basic_block);
|
||||||
static bool cheap_bb_rtx_cost_p (const_basic_block, int);
|
static bool cheap_bb_rtx_cost_p (const_basic_block, int, int);
|
||||||
static rtx first_active_insn (basic_block);
|
static rtx first_active_insn (basic_block);
|
||||||
static rtx last_active_insn (basic_block, int);
|
static rtx last_active_insn (basic_block, int);
|
||||||
static rtx find_active_insn_before (basic_block, rtx);
|
static rtx find_active_insn_before (basic_block, rtx);
|
||||||
|
@ -131,20 +131,31 @@ count_bb_insns (const_basic_block bb)
|
||||||
|
|
||||||
/* Determine whether the total insn_rtx_cost on non-jump insns in
|
/* Determine whether the total insn_rtx_cost on non-jump insns in
|
||||||
basic block BB is less than MAX_COST. This function returns
|
basic block BB is less than MAX_COST. This function returns
|
||||||
false if the cost of any instruction could not be estimated. */
|
false if the cost of any instruction could not be estimated.
|
||||||
|
|
||||||
|
The cost of the non-jump insns in BB is scaled by REG_BR_PROB_BASE
|
||||||
|
as those insns are being speculated. MAX_COST is scaled with SCALE
|
||||||
|
plus a small fudge factor. */
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
cheap_bb_rtx_cost_p (const_basic_block bb, int max_cost)
|
cheap_bb_rtx_cost_p (const_basic_block bb, int scale, int max_cost)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
rtx insn = BB_HEAD (bb);
|
rtx insn = BB_HEAD (bb);
|
||||||
bool speed = optimize_bb_for_speed_p (bb);
|
bool speed = optimize_bb_for_speed_p (bb);
|
||||||
|
|
||||||
|
/* Our branch probability/scaling factors are just estimates and don't
|
||||||
|
account for cases where we can get speculation for free and other
|
||||||
|
secondary benefits. So we fudge the scale factor to make speculating
|
||||||
|
appear a little more profitable. */
|
||||||
|
scale += REG_BR_PROB_BASE / 8;
|
||||||
|
max_cost *= scale;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (NONJUMP_INSN_P (insn))
|
if (NONJUMP_INSN_P (insn))
|
||||||
{
|
{
|
||||||
int cost = insn_rtx_cost (PATTERN (insn), speed);
|
int cost = insn_rtx_cost (PATTERN (insn), speed) * REG_BR_PROB_BASE;
|
||||||
if (cost == 0)
|
if (cost == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -3796,8 +3807,8 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
|
||||||
basic_block then_bb = then_edge->dest;
|
basic_block then_bb = then_edge->dest;
|
||||||
basic_block else_bb = else_edge->dest;
|
basic_block else_bb = else_edge->dest;
|
||||||
basic_block new_bb;
|
basic_block new_bb;
|
||||||
|
int then_bb_index, then_prob;
|
||||||
rtx else_target = NULL_RTX;
|
rtx else_target = NULL_RTX;
|
||||||
int then_bb_index;
|
|
||||||
|
|
||||||
/* If we are partitioning hot/cold basic blocks, we don't want to
|
/* If we are partitioning hot/cold basic blocks, we don't want to
|
||||||
mess up unconditional or indirect jumps that cross between hot
|
mess up unconditional or indirect jumps that cross between hot
|
||||||
|
@ -3840,8 +3851,14 @@ find_if_case_1 (basic_block test_bb, edge then_edge, edge else_edge)
|
||||||
"\nIF-CASE-1 found, start %d, then %d\n",
|
"\nIF-CASE-1 found, start %d, then %d\n",
|
||||||
test_bb->index, then_bb->index);
|
test_bb->index, then_bb->index);
|
||||||
|
|
||||||
/* THEN is small. */
|
if (then_edge->probability)
|
||||||
if (! cheap_bb_rtx_cost_p (then_bb,
|
then_prob = REG_BR_PROB_BASE - then_edge->probability;
|
||||||
|
else
|
||||||
|
then_prob = REG_BR_PROB_BASE / 2;
|
||||||
|
|
||||||
|
/* We're speculating from the THEN path, we want to make sure the cost
|
||||||
|
of speculation is within reason. */
|
||||||
|
if (! cheap_bb_rtx_cost_p (then_bb, then_prob,
|
||||||
COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src),
|
COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (then_edge->src),
|
||||||
predictable_edge_p (then_edge)))))
|
predictable_edge_p (then_edge)))))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -3910,7 +3927,7 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
|
||||||
basic_block then_bb = then_edge->dest;
|
basic_block then_bb = then_edge->dest;
|
||||||
basic_block else_bb = else_edge->dest;
|
basic_block else_bb = else_edge->dest;
|
||||||
edge else_succ;
|
edge else_succ;
|
||||||
rtx note;
|
int then_prob, else_prob;
|
||||||
|
|
||||||
/* If we are partitioning hot/cold basic blocks, we don't want to
|
/* If we are partitioning hot/cold basic blocks, we don't want to
|
||||||
mess up unconditional or indirect jumps that cross between hot
|
mess up unconditional or indirect jumps that cross between hot
|
||||||
|
@ -3949,9 +3966,19 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
|
||||||
if (then_bb->index < NUM_FIXED_BLOCKS)
|
if (then_bb->index < NUM_FIXED_BLOCKS)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
if (else_edge->probability)
|
||||||
|
{
|
||||||
|
else_prob = else_edge->probability;
|
||||||
|
then_prob = REG_BR_PROB_BASE - else_prob;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
else_prob = REG_BR_PROB_BASE / 2;
|
||||||
|
then_prob = REG_BR_PROB_BASE / 2;
|
||||||
|
}
|
||||||
|
|
||||||
/* ELSE is predicted or SUCC(ELSE) postdominates THEN. */
|
/* ELSE is predicted or SUCC(ELSE) postdominates THEN. */
|
||||||
note = find_reg_note (BB_END (test_bb), REG_BR_PROB, NULL_RTX);
|
if (else_prob > then_prob)
|
||||||
if (note && INTVAL (XEXP (note, 0)) >= REG_BR_PROB_BASE / 2)
|
|
||||||
;
|
;
|
||||||
else if (else_succ->dest->index < NUM_FIXED_BLOCKS
|
else if (else_succ->dest->index < NUM_FIXED_BLOCKS
|
||||||
|| dominated_by_p (CDI_POST_DOMINATORS, then_bb,
|
|| dominated_by_p (CDI_POST_DOMINATORS, then_bb,
|
||||||
|
@ -3966,8 +3993,9 @@ find_if_case_2 (basic_block test_bb, edge then_edge, edge else_edge)
|
||||||
"\nIF-CASE-2 found, start %d, else %d\n",
|
"\nIF-CASE-2 found, start %d, else %d\n",
|
||||||
test_bb->index, else_bb->index);
|
test_bb->index, else_bb->index);
|
||||||
|
|
||||||
/* ELSE is small. */
|
/* We're speculating from the ELSE path, we want to make sure the cost
|
||||||
if (! cheap_bb_rtx_cost_p (else_bb,
|
of speculation is within reason. */
|
||||||
|
if (! cheap_bb_rtx_cost_p (else_bb, else_prob,
|
||||||
COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src),
|
COSTS_N_INSNS (BRANCH_COST (optimize_bb_for_speed_p (else_edge->src),
|
||||||
predictable_edge_p (else_edge)))))
|
predictable_edge_p (else_edge)))))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
Loading…
Reference in New Issue