diff options
| author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-18 07:23:08 +0000 |
|---|---|---|
| committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-12-18 07:23:08 +0000 |
| commit | b5860aba6737f2843656672bbb7caf2baee2c496 (patch) | |
| tree | 5c3f58b68d6bf5311edde0b6c488a15485c73c46 | |
| parent | a4d78591ab05ea1cbeb622412090ebc80c1a70ba (diff) | |
| download | ppe42-gcc-b5860aba6737f2843656672bbb7caf2baee2c496.tar.gz ppe42-gcc-b5860aba6737f2843656672bbb7caf2baee2c496.zip | |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108738 138bc75d-0d04-0410-961f-82ee72b054a4
| -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 03f63c34d1f..d30feed3cfd 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 8e4a1995471..00659f3a670 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 e3978d8c2a2..2d89494ca73 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); |

