diff options
author | Jeff Law <law@redhat.com> | 2005-12-18 00:23:08 -0700 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2005-12-18 00:23:08 -0700 |
commit | 6b62dff819633db96e4086f77470fa193bdcde6a (patch) | |
tree | 5c3f58b68d6bf5311edde0b6c488a15485c73c46 | |
parent | a7ceba73e5af3733ab19ecf6cb3dec3c2c64a87a (diff) | |
download | gcc-6b62dff819633db96e4086f77470fa193bdcde6a.zip gcc-6b62dff819633db96e4086f77470fa193bdcde6a.tar.gz gcc-6b62dff819633db96e4086f77470fa193bdcde6a.tar.bz2 |
tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code to simplify SWITCH_EXPR_CODE moved from here to ...
* tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code
to simplify SWITCH_EXPR_CODE moved from here to ...
* tree-ssa-forwprop.c (simplify_switch_expr): Here.
(tree-ssa-forward_propagate_single_use_vars): Call
simplify_switch_expr when appropriate.
From-SVN: r108738
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 65 | ||||
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 60 |
3 files changed, 68 insertions, 65 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 03f63c3..d30feed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-12-18 Jeff Law <law@redhat.com> + + * tree-ssa-dom.c (simplify_switch_and_lookup_avail_expr): Code + to simplify SWITCH_EXPR_CODE moved from here to ... + * tree-ssa-forwprop.c (simplify_switch_expr): Here. + (tree-ssa-forward_propagate_single_use_vars): Call + simplify_switch_expr when appropriate. + 2005-12-17 Andrew Pinski <pinskia@physics.uc.edu> * doc/objc.texi (Type encoding): Add documentation about encoding diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 8e4a199..00659f3 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -274,7 +274,6 @@ static void record_cond (tree, tree); static void record_const_or_copy (tree, tree); static void record_equality (tree, tree); static tree simplify_cond_and_lookup_avail_expr (tree, stmt_ann_t, int); -static tree simplify_switch_and_lookup_avail_expr (tree, int); static tree find_equivalent_equality_comparison (tree); static void record_range (tree, basic_block); static bool extract_range_from_cond (tree, tree *, tree *, int *); @@ -2120,67 +2119,6 @@ simplify_cond_and_lookup_avail_expr (tree stmt, return 0; } -/* STMT is a SWITCH_EXPR for which we could not trivially determine its - result. This routine attempts to find equivalent forms of the - condition which we may be able to optimize better. */ - -static tree -simplify_switch_and_lookup_avail_expr (tree stmt, int insert) -{ - tree cond = SWITCH_COND (stmt); - tree def, to, ti; - - /* The optimization that we really care about is removing unnecessary - casts. That will let us do much better in propagating the inferred - constant at the switch target. */ - if (TREE_CODE (cond) == SSA_NAME) - { - def = SSA_NAME_DEF_STMT (cond); - if (TREE_CODE (def) == MODIFY_EXPR) - { - def = TREE_OPERAND (def, 1); - if (TREE_CODE (def) == NOP_EXPR) - { - int need_precision; - bool fail; - - def = TREE_OPERAND (def, 0); - -#ifdef ENABLE_CHECKING - /* ??? Why was Jeff testing this? We are gimple... */ - gcc_assert (is_gimple_val (def)); -#endif - - to = TREE_TYPE (cond); - ti = TREE_TYPE (def); - - /* If we have an extension that preserves value, then we - can copy the source value into the switch. */ - - need_precision = TYPE_PRECISION (ti); - fail = false; - if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti)) - fail = true; - else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti)) - need_precision += 1; - if (TYPE_PRECISION (to) < need_precision) - fail = true; - - if (!fail) - { - SWITCH_COND (stmt) = def; - mark_stmt_modified (stmt); - - return lookup_avail_expr (stmt, insert); - } - } - } - } - - return 0; -} - - /* CONST_AND_COPIES is a table which maps an SSA_NAME to the current known value for that SSA_NAME (or NULL if no value is known). @@ -2473,9 +2411,6 @@ eliminate_redundant_computations (tree stmt, stmt_ann_t ann) the hash table, simplify the condition and try again. */ if (! cached_lhs && TREE_CODE (stmt) == COND_EXPR) cached_lhs = simplify_cond_and_lookup_avail_expr (stmt, ann, insert); - /* Similarly for a SWITCH_EXPR. */ - else if (!cached_lhs && TREE_CODE (stmt) == SWITCH_EXPR) - cached_lhs = simplify_switch_and_lookup_avail_expr (stmt, insert); opt_stats.num_exprs_considered++; diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index e3978d8..2d89494 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -739,6 +739,61 @@ simplify_not_neg_expr (tree stmt) } } +/* STMT is a SWITCH_EXPR for which we attempt to find equivalent forms of + the condition which we may be able to optimize better. */ + +static void +simplify_switch_expr (tree stmt) +{ + tree cond = SWITCH_COND (stmt); + tree def, to, ti; + + /* The optimization that we really care about is removing unnecessary + casts. That will let us do much better in propagating the inferred + constant at the switch target. */ + if (TREE_CODE (cond) == SSA_NAME) + { + def = SSA_NAME_DEF_STMT (cond); + if (TREE_CODE (def) == MODIFY_EXPR) + { + def = TREE_OPERAND (def, 1); + if (TREE_CODE (def) == NOP_EXPR) + { + int need_precision; + bool fail; + + def = TREE_OPERAND (def, 0); + +#ifdef ENABLE_CHECKING + /* ??? Why was Jeff testing this? We are gimple... */ + gcc_assert (is_gimple_val (def)); +#endif + + to = TREE_TYPE (cond); + ti = TREE_TYPE (def); + + /* If we have an extension that preserves value, then we + can copy the source value into the switch. */ + + need_precision = TYPE_PRECISION (ti); + fail = false; + if (TYPE_UNSIGNED (to) && !TYPE_UNSIGNED (ti)) + fail = true; + else if (!TYPE_UNSIGNED (to) && TYPE_UNSIGNED (ti)) + need_precision += 1; + if (TYPE_PRECISION (to) < need_precision) + fail = true; + + if (!fail) + { + SWITCH_COND (stmt) = def; + update_stmt (stmt); + } + } + } + } +} + /* Main entry point for the forward propagation optimizer. */ static void @@ -788,6 +843,11 @@ tree_ssa_forward_propagate_single_use_vars (void) else bsi_next (&bsi); } + else if (TREE_CODE (stmt) == SWITCH_EXPR) + { + simplify_switch_expr (stmt); + bsi_next (&bsi); + } else if (TREE_CODE (stmt) == COND_EXPR) { forward_propagate_into_cond (stmt); |