re PR tree-optimization/40436 (0.5% code size regression caused by r147852)
authorJan Hubicka <jh@suse.cz>
Wed, 10 Nov 2010 02:35:19 +0000 (03:35 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 10 Nov 2010 02:35:19 +0000 (02:35 +0000)
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

gcc/ChangeLog
gcc/ipa-inline.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c
gcc/tree-inline.c
gcc/tree-inline.h

index f602a02a36cc4f80ed2c711d8b4605aed3a934a0..0f219668d618e36dfcbdc3dfb2b3a0e0b2cffcb7 100644 (file)
@@ -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
index 7241dcb0d48a5fcd300cbaa3c3bc5c2e5821a9ce..0072d61bfc36d2c84a20f0d7b560144b42af33d0 100644 (file)
@@ -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;
 }
index 651e921278b941dd1408b7c2889bb3b451748157..e4cb43653478132f945d3ae9a1994e5c2504a4ee 100644 (file)
@@ -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.
index 6591c12d2c65a61c2daaf23a7552b671ad37a407..506df88f956198c89567a5d893a2a45e2fe7031b 100644 (file)
@@ -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 } } */
index 88806beddd3bf54f10cac610560ec1cdae47877a..fc470a7637e31012ea2a9eb5130ac5f035977ab1 100644 (file)
@@ -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. */
index a8a33aa84d9e4ebae4d92713ff9a3e000ad8812f..fa0353735a750b77deca800088954db85ddcd7c6 100644 (file)
@@ -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.  */