diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 26b5d22546839e4b334d743c7a4a42d8f08d576b..2bb462c748c920809c7760d8ec1fcb8b27c782fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-04-27  Jan Hubicka  <jh@suse.cz>
+
+	* tree-inline.c (eni_inlining_weights): Remove.
+	(estimate_num_insns): Special case more builtins.
+
 2010-04-27  Shujing Zhao  <pearly.zhao@oracle.com>
 	
 	PR c/32207
diff --git a/gcc/testsuite/g++.dg/warn/string1.C b/gcc/testsuite/g++.dg/warn/string1.C
index 302772795cdbb73b9a7eb20ba01404b3a4b66987..2670f63d931be2cde6483956efc0d1613c2ce056 100644
--- a/gcc/testsuite/g++.dg/warn/string1.C
+++ b/gcc/testsuite/g++.dg/warn/string1.C
@@ -2,7 +2,7 @@
 // { dg-options "-O" }
 
 #include <string>
-int main() {
+int test() {
   // blank line padding, could also be code...
   //
   //
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 0c1293e65171907417469b175293273890179759..9fb9faf0d84ed81c48b19507c4396794ebfd53c0 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -101,10 +101,6 @@ along with GCC; see the file COPYING3.  If not see
      calls?  */
 
 
-/* Weights that estimate_num_insns uses for heuristics in inlining.  */
-
-eni_weights eni_inlining_weights;
-
 /* Weights that estimate_num_insns uses to estimate the size of the
    produced code.  */
 
@@ -3268,22 +3264,93 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
 	if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
 	  switch (DECL_FUNCTION_CODE (decl))
 	    {
+	    /* Builtins that expand to constants.  */
 	    case BUILT_IN_CONSTANT_P:
-	      return 0;
 	    case BUILT_IN_EXPECT:
-	      return 0;
-
-	    /* Prefetch instruction is not expensive.  */
-	    case BUILT_IN_PREFETCH:
-	      cost = weights->target_builtin_call_cost;
-	      break;
-
+	    case BUILT_IN_OBJECT_SIZE:
+	    case BUILT_IN_UNREACHABLE:
+	    /* Simple register moves or loads from stack.  */
+	    case BUILT_IN_RETURN_ADDRESS:
+	    case BUILT_IN_EXTRACT_RETURN_ADDR:
+	    case BUILT_IN_FROB_RETURN_ADDR:
+	    case BUILT_IN_RETURN:
+	    case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
+	    case BUILT_IN_FRAME_ADDRESS:
+	    case BUILT_IN_VA_END:
+	    case BUILT_IN_STACK_SAVE:
+	    case BUILT_IN_STACK_RESTORE:
 	    /* Exception state returns or moves registers around.  */
 	    case BUILT_IN_EH_FILTER:
 	    case BUILT_IN_EH_POINTER:
 	    case BUILT_IN_EH_COPY_VALUES:
 	      return 0;
 
+	    /* builtins that are not expensive (that is they are most probably
+	       expanded inline into resonably simple code).  */
+	    case BUILT_IN_ABS:
+	    case BUILT_IN_ALLOCA:
+	    case BUILT_IN_BSWAP32:
+	    case BUILT_IN_BSWAP64:
+	    case BUILT_IN_CLZ:
+	    case BUILT_IN_CLZIMAX:
+	    case BUILT_IN_CLZL:
+	    case BUILT_IN_CLZLL:
+	    case BUILT_IN_CTZ:
+	    case BUILT_IN_CTZIMAX:
+	    case BUILT_IN_CTZL:
+	    case BUILT_IN_CTZLL:
+	    case BUILT_IN_FFS:
+	    case BUILT_IN_FFSIMAX:
+	    case BUILT_IN_FFSL:
+	    case BUILT_IN_FFSLL:
+	    case BUILT_IN_IMAXABS:
+	    case BUILT_IN_FINITE:
+	    case BUILT_IN_FINITEF:
+	    case BUILT_IN_FINITEL:
+	    case BUILT_IN_FINITED32:
+	    case BUILT_IN_FINITED64:
+	    case BUILT_IN_FINITED128:
+	    case BUILT_IN_FPCLASSIFY:
+	    case BUILT_IN_ISFINITE:
+	    case BUILT_IN_ISINF_SIGN:
+	    case BUILT_IN_ISINF:
+	    case BUILT_IN_ISINFF:
+	    case BUILT_IN_ISINFL:
+	    case BUILT_IN_ISINFD32:
+	    case BUILT_IN_ISINFD64:
+	    case BUILT_IN_ISINFD128:
+	    case BUILT_IN_ISNAN:
+	    case BUILT_IN_ISNANF:
+	    case BUILT_IN_ISNANL:
+	    case BUILT_IN_ISNAND32:
+	    case BUILT_IN_ISNAND64:
+	    case BUILT_IN_ISNAND128:
+	    case BUILT_IN_ISNORMAL:
+	    case BUILT_IN_ISGREATER:
+	    case BUILT_IN_ISGREATEREQUAL:
+	    case BUILT_IN_ISLESS:
+	    case BUILT_IN_ISLESSEQUAL:
+	    case BUILT_IN_ISLESSGREATER:
+	    case BUILT_IN_ISUNORDERED:
+	    case BUILT_IN_VA_ARG_PACK:
+	    case BUILT_IN_VA_ARG_PACK_LEN:
+	    case BUILT_IN_VA_COPY:
+	    case BUILT_IN_TRAP:
+	    case BUILT_IN_SAVEREGS:
+	    case BUILT_IN_POPCOUNTL:
+	    case BUILT_IN_POPCOUNTLL:
+	    case BUILT_IN_POPCOUNTIMAX:
+	    case BUILT_IN_POPCOUNT:
+	    case BUILT_IN_PARITYL:
+	    case BUILT_IN_PARITYLL:
+	    case BUILT_IN_PARITYIMAX:
+	    case BUILT_IN_PARITY:
+	    case BUILT_IN_LABS:
+	    case BUILT_IN_LLABS:
+	    case BUILT_IN_PREFETCH:
+	      cost = weights->target_builtin_call_cost;
+	      break;
+
 	    default:
 	      break;
 	    }