6627983: G1: Bad oop deference during marking

Bulk zeroing reduction didn't work with G1, because arraycopy would call pre-barriers on uninitialized oops. The solution is to have version of arraycopy stubs that don't have pre-barriers. Also refactored arraycopy stubs generation on SPARC to be more readable and reduced the number of stubs necessary in some cases.

Reviewed-by: jrose, kvn, never
This commit is contained in:
Igor Veresov 2011-03-01 14:56:48 -08:00
parent 5432554ecb
commit 90a153aa38
10 changed files with 353 additions and 205 deletions

View file

@ -83,11 +83,15 @@ public:
}
template <class T> void write_ref_array_pre_work(T* dst, int count);
virtual void write_ref_array_pre(oop* dst, int count) {
write_ref_array_pre_work(dst, count);
virtual void write_ref_array_pre(oop* dst, int count, bool dest_uninitialized) {
if (!dest_uninitialized) {
write_ref_array_pre_work(dst, count);
}
}
virtual void write_ref_array_pre(narrowOop* dst, int count) {
write_ref_array_pre_work(dst, count);
virtual void write_ref_array_pre(narrowOop* dst, int count, bool dest_uninitialized) {
if (!dest_uninitialized) {
write_ref_array_pre_work(dst, count);
}
}
};