]> gcc.gnu.org Git - gcc.git/commitdiff
re PR tree-optimization/46726 (x*x has different cost than pow(x,2) with -ffast-math)
authorRichard Guenther <rguenther@suse.de>
Tue, 7 Dec 2010 10:43:38 +0000 (10:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 7 Dec 2010 10:43:38 +0000 (10:43 +0000)
2010-12-07  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/46726
* tree-inline.c (estimate_num_insns): Special case pow (x, 2.0).

From-SVN: r167531

gcc/ChangeLog
gcc/tree-inline.c

index 5074b3feb1cda5e8607949a2fb0daac5c45e81f0..192d16ffcec6d8b4902ef46a5a95686f5979f396 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-07  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/46726
+       * tree-inline.c (estimate_num_insns): Special case pow (x, 2.0).
+
 2010-12-07  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-math-opts.c (execute_optimize_widening_mul): Unlink
index 97a9869d31ee033841af9c941c2edf80e0a154a2..def733fe4669317de5ea5467a20e485dc18e366a 100644 (file)
@@ -3496,16 +3496,37 @@ estimate_num_insns (gimple stmt, eni_weights *weights)
        /* 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))
          return weights->target_builtin_call_cost;
-       else
-         cost = weights->call_cost;
+       else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
+         {
+           /* We canonicalize x * x to pow (x, 2.0) with -ffast-math, so
+              specialize the cheap expansion we do here.
+              ???  This asks for a more general solution.  */
+           switch (DECL_FUNCTION_CODE (decl))
+             {
+               case BUILT_IN_POW:
+               case BUILT_IN_POWF:
+               case BUILT_IN_POWL:
+                 if (TREE_CODE (gimple_call_arg (stmt, 1)) == REAL_CST
+                     && REAL_VALUES_EQUAL
+                          (TREE_REAL_CST (gimple_call_arg (stmt, 1)), dconst2))
+                   return estimate_operator_cost (MULT_EXPR, weights,
+                                                  gimple_call_arg (stmt, 0),
+                                                  gimple_call_arg (stmt, 0));
+                 break;
+
+               default:
+                 break;
+             }
+         }
 
+       cost = weights->call_cost;
        if (decl)
          funtype = TREE_TYPE (decl);
 
This page took 0.097511 seconds and 5 git commands to generate.