SUGGESTED FIX
Potential fix:
cairnapple{jc234399}:263> hg diff src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
diff -r eb058abd0562 src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
--- a/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Tue Sep 15 16:50:50 2009 -0700
+++ b/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp Wed Sep 30 17:56:54 2009 -0700
@@ -668,7 +668,7 @@ void LIRGenerator::do_CompareAndSwap(Int
__ add(obj.result(), offset.result(), addr);
if (type == objectType) { // Write-barrier needed for Object fields.
- pre_barrier(obj.result(), false, NULL);
+ pre_barrier(addr, false, NULL);
}
if (type == objectType)
cairnapple{jc234399}:264>
The current code generates a load from the base object to fetch the previous value (even through we are storing into obj.field) which then gets enqueued in the SATB buffer. We should be generating a load from &obj+offset(field) which is "addr" in the above code.
I have made the changes and the test case ran for several days until it was killed.
|