OSDN Git Service

2005-04-08 Andrew MacLeod <amacleod@redhat.com>
authoramacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 13:09:26 +0000 (13:09 +0000)
committeramacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 13:09:26 +0000 (13:09 +0000)
* 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

gcc/ChangeLog
gcc/tree-ssa-operands.c

index 63c699b..33d84cf 100644 (file)
@@ -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.
index a967f98..5d5f6ba 100644 (file)
@@ -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;
     }