From 75c54ddf0f22ea20e91dc6c2082473b552da29f6 Mon Sep 17 00:00:00 2001 From: johnc Date: Wed, 17 Apr 2013 10:57:02 -0700 Subject: [PATCH] 8012335: G1: Fix bug with compressed oops in template interpreter on x86 and sparc. Summary: In do_oop_store the uncompressed value of the oop being stored needs to be preserved and passed to g1_write_barrier_post. This is necessary for the heap region cross check to work correctly. Reviewed-by: coleenp, johnc Contributed-by: Martin Doerr --- src/cpu/sparc/vm/templateTable_sparc.cpp | 9 ++++++++- src/cpu/x86/vm/templateTable_x86_64.cpp | 9 +++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/cpu/sparc/vm/templateTable_sparc.cpp b/src/cpu/sparc/vm/templateTable_sparc.cpp index 01d593fb0..bc4490b0b 100644 --- a/src/cpu/sparc/vm/templateTable_sparc.cpp +++ b/src/cpu/sparc/vm/templateTable_sparc.cpp @@ -63,6 +63,13 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, noreg /* pre_val */, tmp, true /*preserve_o_regs*/); + // G1 barrier needs uncompressed oop for region cross check. + Register new_val = val; + if (UseCompressedOops && val != G0) { + new_val = tmp; + __ mov(val, new_val); + } + if (index == noreg ) { assert(Assembler::is_simm13(offset), "fix this code"); __ store_heap_oop(val, base, offset); @@ -79,7 +86,7 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, __ add(base, index, base); } } - __ g1_write_barrier_post(base, val, tmp); + __ g1_write_barrier_post(base, new_val, tmp); } } break; diff --git a/src/cpu/x86/vm/templateTable_x86_64.cpp b/src/cpu/x86/vm/templateTable_x86_64.cpp index d1e22d259..5f5d1947f 100644 --- a/src/cpu/x86/vm/templateTable_x86_64.cpp +++ b/src/cpu/x86/vm/templateTable_x86_64.cpp @@ -158,14 +158,19 @@ static void do_oop_store(InterpreterMacroAssembler* _masm, if (val == noreg) { __ store_heap_oop_null(Address(rdx, 0)); } else { + // G1 barrier needs uncompressed oop for region cross check. + Register new_val = val; + if (UseCompressedOops) { + new_val = rbx; + __ movptr(new_val, val); + } __ store_heap_oop(Address(rdx, 0), val); __ g1_write_barrier_post(rdx /* store_adr */, - val /* new_val */, + new_val /* new_val */, r15_thread /* thread */, r8 /* tmp */, rbx /* tmp2 */); } - } break; #endif // INCLUDE_ALL_GCS -- GitLab