aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-complex.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2005-06-18 23:35:52 -0700
committerRichard Henderson <rth@gcc.gnu.org>2005-06-18 23:35:52 -0700
commit99e6bdda90bc96029f692df81028dcdaa65e3dea (patch)
tree70c9f858c3de8aaa06631784a98a24206baa9fe2 /gcc/tree-complex.c
parentaad97b9bddd3ba89e6b39f8c28c4fe714f65fd52 (diff)
downloadgcc-99e6bdda90bc96029f692df81028dcdaa65e3dea.zip
gcc-99e6bdda90bc96029f692df81028dcdaa65e3dea.tar.gz
gcc-99e6bdda90bc96029f692df81028dcdaa65e3dea.tar.bz2
tree-complex.c (init_dont_simulate_again): Clear DONT_SIMULATE_AGAIN for control-altering statements; set it again for returns.
* tree-complex.c (init_dont_simulate_again): Clear DONT_SIMULATE_AGAIN for control-altering statements; set it again for returns. (complex_visit_stmt): Return SSA_PROP_VARYING for stmts that are not MODIFY_EXPR. From-SVN: r101178
Diffstat (limited to 'gcc/tree-complex.c')
-rw-r--r--gcc/tree-complex.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c
index a3470b1..f949633 100644
--- a/gcc/tree-complex.c
+++ b/gcc/tree-complex.c
@@ -160,12 +160,20 @@ init_dont_simulate_again (void)
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
{
tree orig_stmt, stmt, rhs = NULL;
- bool dsa = true;
+ bool dsa;
orig_stmt = stmt = bsi_stmt (bsi);
+
+ /* Most control-altering statements must be initially
+ simulated, else we won't cover the entire cfg. */
+ dsa = !stmt_ends_bb_p (stmt);
+
switch (TREE_CODE (stmt))
{
case RETURN_EXPR:
+ /* We don't care what the lattice value of <retval> is,
+ since it's never used as an input to another computation. */
+ dsa = true;
stmt = TREE_OPERAND (stmt, 0);
if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
break;
@@ -228,15 +236,14 @@ complex_visit_stmt (tree stmt, edge *taken_edge_p ATTRIBUTE_UNUSED,
unsigned int ver;
tree lhs, rhs;
- /* These conditions should be satisfied due to the initial filter
- set up in init_dont_simulate_again. */
- if (TREE_CODE (stmt) == RETURN_EXPR)
- stmt = TREE_OPERAND (stmt, 0);
- gcc_assert (TREE_CODE (stmt) == MODIFY_EXPR);
+ if (TREE_CODE (stmt) != MODIFY_EXPR)
+ return SSA_PROP_VARYING;
lhs = TREE_OPERAND (stmt, 0);
rhs = TREE_OPERAND (stmt, 1);
+ /* These conditions should be satisfied due to the initial filter
+ set up in init_dont_simulate_again. */
gcc_assert (TREE_CODE (lhs) == SSA_NAME);
gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);