aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2005-12-18 00:23:08 -0700
committerJeff Law <law@gcc.gnu.org>2005-12-18 00:23:08 -0700
commit6b62dff819633db96e4086f77470fa193bdcde6a (patch)
tree5c3f58b68d6bf5311edde0b6c488a15485c73c46
parenta7ceba73e5af3733ab19ecf6cb3dec3c2c64a87a (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/tree-ssa-dom.c65
-rw-r--r--gcc/tree-ssa-forwprop.c60
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);