re PR tree-optimization/40436 (0.5% code size regression caused by r147852)
PR tree-optimization/40436 * ipa-inline.c (leaf_node_p): Implement using is_inexpensive_builtin. * tree-inline.c (estimate_num_insns): Inexpensive builtins are like normal instructions; be sure bultin is not implemented in this file; compute non-zero return cost. (init_inline_once): Reduce builtin_call_cost to 1; set return cost. * tree-inline.h (eni_weights_d): Add return cost. From-SVN: r166517
This commit is contained in:
parent
b8cbdff525
commit
9bb2f479f3
6 changed files with 36 additions and 9 deletions
|
@ -1,3 +1,13 @@
|
|||
2010-11-09 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
PR tree-optimization/40436
|
||||
* ipa-inline.c (leaf_node_p): Implement using is_inexpensive_builtin.
|
||||
* tree-inline.c (estimate_num_insns): Inexpensive builtins are like
|
||||
normal instructions; be sure bultin is not implemented in this file;
|
||||
compute non-zero return cost.
|
||||
(init_inline_once): Reduce builtin_call_cost to 1; set return cost.
|
||||
* tree-inline.h (eni_weights_d): Add return cost.
|
||||
|
||||
2010-11-09 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* c-parser.c (c_parser_struct_declaration): Handle declaration
|
||||
|
|
|
@ -1578,16 +1578,15 @@ cgraph_decide_inlining (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Return true when N is leaf function. Accept cheap (pure&const) builtins
|
||||
/* Return true when N is leaf function. Accept cheap builtins
|
||||
in leaf functions. */
|
||||
|
||||
static bool
|
||||
leaf_node_p (struct cgraph_node *n)
|
||||
{
|
||||
struct cgraph_edge *e;
|
||||
for (e = n->callees; e; e = e->next_callee)
|
||||
if (!DECL_BUILT_IN (e->callee->decl)
|
||||
|| (!TREE_READONLY (e->callee->decl)
|
||||
|| DECL_PURE_P (e->callee->decl)))
|
||||
if (!is_inexpensive_builtin (e->callee->decl))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2010-11-09 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop unrolling.
|
||||
|
||||
2010-11-09 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* gcc.dg/struct-semi-4.c: New test.
|
||||
|
|
|
@ -31,4 +31,5 @@ void t3(void)
|
|||
r[i] = sqrtf (a[i]);
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "vrsqrtps\[ \\t\]+\[^\n\]*%ymm" 3 } } */
|
||||
/* Last loop is small enough to be fully unrolled. */
|
||||
/* { dg-final { scan-assembler-times "vrsqrtps\[ \\t\]+\[^\n\]*%ymm" 4 } } */
|
||||
|
|
|
@ -3484,10 +3484,16 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
|
|||
if (POINTER_TYPE_P (funtype))
|
||||
funtype = TREE_TYPE (funtype);
|
||||
|
||||
if (is_simple_builtin (decl))
|
||||
/* Do not special case builtins where we see the body.
|
||||
This just confuse inliner. */
|
||||
if (!decl || cgraph_node (decl)->analyzed)
|
||||
cost = weights->call_cost;
|
||||
/* For buitins that are likely expanded to nothing or
|
||||
inlined do not account operand costs. */
|
||||
else if (is_simple_builtin (decl))
|
||||
return 0;
|
||||
else if (is_inexpensive_builtin (decl))
|
||||
cost = weights->target_builtin_call_cost;
|
||||
return weights->target_builtin_call_cost;
|
||||
else
|
||||
cost = weights->call_cost;
|
||||
|
||||
|
@ -3536,11 +3542,13 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
|
|||
break;
|
||||
}
|
||||
|
||||
case GIMPLE_RETURN:
|
||||
return weights->return_cost;
|
||||
|
||||
case GIMPLE_GOTO:
|
||||
case GIMPLE_LABEL:
|
||||
case GIMPLE_NOP:
|
||||
case GIMPLE_PHI:
|
||||
case GIMPLE_RETURN:
|
||||
case GIMPLE_PREDICT:
|
||||
case GIMPLE_DEBUG:
|
||||
return 0;
|
||||
|
@ -3640,16 +3648,18 @@ init_inline_once (void)
|
|||
eni_size_weights.div_mod_cost = 1;
|
||||
eni_size_weights.omp_cost = 40;
|
||||
eni_size_weights.time_based = false;
|
||||
eni_size_weights.return_cost = 1;
|
||||
|
||||
/* Estimating time for call is difficult, since we have no idea what the
|
||||
called function does. In the current uses of eni_time_weights,
|
||||
underestimating the cost does less harm than overestimating it, so
|
||||
we choose a rather small value here. */
|
||||
eni_time_weights.call_cost = 10;
|
||||
eni_time_weights.target_builtin_call_cost = 10;
|
||||
eni_time_weights.target_builtin_call_cost = 1;
|
||||
eni_time_weights.div_mod_cost = 10;
|
||||
eni_time_weights.omp_cost = 40;
|
||||
eni_time_weights.time_based = true;
|
||||
eni_time_weights.return_cost = 2;
|
||||
}
|
||||
|
||||
/* Estimate the number of instructions in a gimple_seq. */
|
||||
|
|
|
@ -144,6 +144,9 @@ typedef struct eni_weights_d
|
|||
/* Cost for omp construct. */
|
||||
unsigned omp_cost;
|
||||
|
||||
/* Cost of return. */
|
||||
unsigned return_cost;
|
||||
|
||||
/* True when time of statemnt should be estimated. Thus i.e
|
||||
cost of switch statement is logarithmic rather than linear in number
|
||||
of cases. */
|
||||
|
|
Loading…
Add table
Reference in a new issue