From: hubicka Date: Wed, 10 Nov 2010 02:35:19 +0000 (+0000) Subject: PR tree-optimization/40436 X-Git-Tag: upstream/4.9.2~25013 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=958b3c8ac82ed1a8c30d505430babba40a3e132e;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@166517 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f602a02..0f21966 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2010-11-09 Jan Hubicka + + 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 * c-parser.c (c_parser_struct_declaration): Handle declaration diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 7241dcb..0072d61 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 651e921..e4cb436 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-11-09 Jan Hubicka + + * testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop unrolling. + 2010-11-09 Joseph Myers * gcc.dg/struct-semi-4.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c b/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c index 6591c12..506df88 100644 --- a/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c +++ b/gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c @@ -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 } } */ diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 88806be..fc470a7 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -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. */ diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index a8a33aa..fa03537 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -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. */