diff options
author | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-08 13:09:26 +0000 |
---|---|---|
committer | amacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-08 13:09:26 +0000 |
commit | 73feee9fac73f33b27151c01299a9ece993ee3db (patch) | |
tree | c0b293e3155dd2e5c5cd33a337e3764d90136d92 /gcc/tree-ssa-operands.c | |
parent | 9d3fc72c353ac4402f9b16d43d5add3bc7e816da (diff) | |
download | gcc-73feee9fac73f33b27151c01299a9ece993ee3db.tar.gz |
2005-04-08 Andrew MacLeod <amacleod@redhat.com>
* tree-ssa-operands.c (correct_use_link): Remove linear scan.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@97827 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-operands.c')
-rw-r--r-- | gcc/tree-ssa-operands.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index a967f98f6b0..5d5f6bac4e2 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -456,7 +456,8 @@ finalize_ssa_defs (def_optype *old_ops_p, tree stmt) changed what this pointer points to via TREE_OPERANDS (exp, 0) = <...>. THe contents are different, but the the pointer is still the same. This routine will check to make sure PTR is in the correct list, and if it isn't - put it in the correct list. */ + put it in the correct list. We cannot simply check the previous node + because all nodes in the same stmt might have be changed. */ static inline void correct_use_link (ssa_imm_use_t *ptr, tree stmt) @@ -471,10 +472,28 @@ correct_use_link (ssa_imm_use_t *ptr, tree stmt) prev = ptr->prev; if (prev) { - /* find the root, which has a non-NULL stmt, and a NULL use. */ - while (prev->stmt == NULL || prev->use != NULL) - prev = prev->prev; - root = prev->stmt; + bool stmt_mod = true; + /* Find the first element which isn't a SAFE iterator, is in a sifferent + stmt, and is not a a modified stmt, That node is in the correct list, + see if we are too. */ + + while (stmt_mod) + { + while (prev->stmt == stmt || prev->stmt == NULL) + prev = prev->prev; + if (prev->use == NULL) + stmt_mod = false; + else + if ((stmt_mod = stmt_modified_p (prev->stmt))) + prev = prev->prev; + } + + /* Get the ssa_name of the list the node is in. */ + if (prev->use == NULL) + root = prev->stmt; + else + root = *(prev->use); + /* If its the right list, simply return. */ if (root == *(ptr->use)) return; } |