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 | |
| parent | 9d3fc72c353ac4402f9b16d43d5add3bc7e816da (diff) | |
| download | ppe42-gcc-73feee9fac73f33b27151c01299a9ece993ee3db.tar.gz ppe42-gcc-73feee9fac73f33b27151c01299a9ece993ee3db.zip | |
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
| -rw-r--r-- | gcc/ChangeLog | 4 | ||||
| -rw-r--r-- | gcc/tree-ssa-operands.c | 29 |
2 files changed, 28 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63c699b9ba8..33d84cf10fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2005-04-08 Andrew MacLeod <amacleod@redhat.com> + + * tree-ssa-operands.c (correct_use_link): Remove linear scan. + 2005-04-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * system.h: Revert last change. 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; } |

