From: Andrew MacLeod Date: Fri, 8 Apr 2005 13:09:26 +0000 (+0000) Subject: tree-ssa-operands.c (correct_use_link): Remove linear scan. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3623aa7017f2a9e867c4703e755933c10ebd4f94;p=gcc.git tree-ssa-operands.c (correct_use_link): Remove linear scan. 2005-04-08 Andrew MacLeod * tree-ssa-operands.c (correct_use_link): Remove linear scan. From-SVN: r97827 --- 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 + + * tree-ssa-operands.c (correct_use_link): Remove linear scan. + 2005-04-08 Kaveh R. Ghazi * 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; }