re PR tree-optimization/34708 (Inlining heuristics issue)
authorJan Hubicka <jh@suse.cz>
Wed, 9 Jan 2008 19:19:40 +0000 (20:19 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 9 Jan 2008 19:19:40 +0000 (19:19 +0000)
PR tree-optimization/34708
* tree-inline.c (estimate_num_insns_1): Compute cost of SWITCH_EXPR
based on number of case labels.
(init_inline_once): Remove switch_cost.
* tree-inline.h (eni_weights_d): Remove switch_cost.

From-SVN: r131433

gcc/ChangeLog
gcc/tree-inline.c
gcc/tree-inline.h

index bfdeb65..9f03fe3 100644 (file)
@@ -1,3 +1,11 @@
+2008-01-09  Jan Hubicka  <jh@suse.cz>
+
+       PR tree-optimization/34708
+       * tree-inline.c (estimate_num_insns_1): Compute cost of SWITCH_EXPR
+       based on number of case labels.
+       (init_inline_once): Remove switch_cost.
+       * tree-inline.h (eni_weights_d): Remove switch_cost.
+
 2008-01-09  Richard Guenther  <rguenther@suse.de>
        Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
index 8c5626d..f825c5d 100644 (file)
@@ -2387,9 +2387,12 @@ estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
       break;
 
     case SWITCH_EXPR:
-      /* TODO: Cost of a switch should be derived from the number of
-        branches.  */
-      d->count += d->weights->switch_cost;
+      /* Take into account cost of the switch + guess 2 conditional jumps for
+         each case label.  
+
+        TODO: once the switch expansion logic is sufficiently separated, we can
+        do better job on estimating cost of the switch.  */
+      d->count += TREE_VEC_LENGTH (SWITCH_LABELS (x)) * 2;
       break;
 
     /* Few special cases of expensive operations.  This is useful
@@ -2518,13 +2521,11 @@ init_inline_once (void)
   eni_inlining_weights.call_cost = PARAM_VALUE (PARAM_INLINE_CALL_COST);
   eni_inlining_weights.target_builtin_call_cost = 1;
   eni_inlining_weights.div_mod_cost = 10;
-  eni_inlining_weights.switch_cost = 1;
   eni_inlining_weights.omp_cost = 40;
 
   eni_size_weights.call_cost = 1;
   eni_size_weights.target_builtin_call_cost = 1;
   eni_size_weights.div_mod_cost = 1;
-  eni_size_weights.switch_cost = 10;
   eni_size_weights.omp_cost = 40;
 
   /* Estimating time for call is difficult, since we have no idea what the
@@ -2534,7 +2535,6 @@ init_inline_once (void)
   eni_time_weights.call_cost = 10;
   eni_time_weights.target_builtin_call_cost = 10;
   eni_time_weights.div_mod_cost = 10;
-  eni_time_weights.switch_cost = 4;
   eni_time_weights.omp_cost = 40;
 }
 
index dbb78d0..893b9c9 100644 (file)
@@ -115,9 +115,6 @@ typedef struct eni_weights_d
   /* Cost of "expensive" div and mod operations.  */
   unsigned div_mod_cost;
 
-  /* Cost of switch statement.  */
-  unsigned switch_cost;
-
   /* Cost for omp construct.  */
   unsigned omp_cost;
 } eni_weights;