diff src/share/vm/opto/gcm.cpp @ 215:273eaa04d9a1

6714694: assertion in 64bit server vm (store->find_edge(load) != -1,"missing precedence edge") with COOPs Summary: The method raise_LCA_above_marks() terminates LCA search early. Reviewed-by: rasbold, never
author kvn
date Fri, 20 Jun 2008 10:17:09 -0700
parents 6152cbb08ce9
children 9c2ecc2ffb12
line wrap: on
line diff
--- a/src/share/vm/opto/gcm.cpp	Tue Jun 17 11:32:42 2008 -0700
+++ b/src/share/vm/opto/gcm.cpp	Fri Jun 20 10:17:09 2008 -0700
@@ -307,7 +307,6 @@
 
     // Test and set the visited bit.
     if (mid->raise_LCA_visited() == mark)  continue;  // already visited
-    mid->set_raise_LCA_visited(mark);
 
     // Don't process the current LCA, otherwise the search may terminate early
     if (mid != LCA && mid->raise_LCA_mark() == mark) {
@@ -317,6 +316,8 @@
       assert(early->dominates(LCA), "early is high enough");
       // Resume searching at that point, skipping intermediate levels.
       worklist.push(LCA);
+      if (LCA == mid)
+        continue; // Don't mark as visited to avoid early termination.
     } else {
       // Keep searching through this block's predecessors.
       for (uint j = 1, jmax = mid->num_preds(); j < jmax; j++) {
@@ -324,6 +325,7 @@
         worklist.push(mid_parent);
       }
     }
+    mid->set_raise_LCA_visited(mark);
   }
   return LCA;
 }