diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp index f96c361ce6b..1a21c07acc9 100644 --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp @@ -5770,16 +5770,13 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in RegState reg_state[]) { assert(sig->at(sig_index)._bt == T_VOID, "should be at end delimiter"); assert(from->is_valid(), "source must be valid"); - Register tmp1 = r10, tmp2 = r11; - Register fromReg; - if (from->is_reg()) { - fromReg = from->as_Register(); - } else { - int st_off = from->reg2stack() * VMRegImpl::stack_slot_size; - ldr(tmp1, Address(sp, st_off)); - fromReg = tmp1; - } +#ifdef ASSERT + bool progress = false; + const int start_offset = offset(); +#endif + Register tmp1 = r10, tmp2 = r11; + Register fromReg = noreg; ScalarizedInlineArgsStream stream(sig, sig_index, to, to_count, to_index, -1); bool done = true; bool mark_done = true; @@ -5789,7 +5786,6 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in assert(toReg->is_valid(), "destination must be valid"); int off = sig->at(stream.sig_index())._offset; assert(off > 0, "offset in object should be positive"); - Address fromAddr = Address(fromReg, off); int idx = (int)toReg->value(); if (reg_state[idx] == reg_readonly) { @@ -5800,11 +5796,21 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in continue; } else if (reg_state[idx] == reg_written) { continue; - } else { - assert(reg_state[idx] == reg_writable, "must be writable"); - reg_state[idx] = reg_written; } + assert(reg_state[idx] == reg_writable, "must be writable"); + reg_state[idx] = reg_written; + DEBUG_ONLY(progress = true); + if (fromReg == noreg) { + if (from->is_reg()) { + fromReg = from->as_Register(); + } else { + int st_off = from->reg2stack() * VMRegImpl::stack_slot_size; + ldr(tmp1, Address(sp, st_off)); + fromReg = tmp1; + } + } + Address fromAddr = Address(fromReg, off); if (!toReg->is_FloatRegister()) { Register dst = toReg->is_stack() ? tmp2 : toReg->as_Register(); if (is_reference_type(bt)) { @@ -5832,6 +5838,7 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in reg_state[from->value()] = reg_writable; } from_index--; + assert(progress || (start_offset == offset()), "should not emit code"); return done; } diff --git a/src/hotspot/cpu/x86/macroAssembler_x86.cpp b/src/hotspot/cpu/x86/macroAssembler_x86.cpp index d0c141418a0..a7545b3e8af 100644 --- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp @@ -5663,15 +5663,12 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in RegState reg_state[]) { assert(sig->at(sig_index)._bt == T_VOID, "should be at end delimiter"); assert(from->is_valid(), "source must be valid"); - Register fromReg; - if (from->is_reg()) { - fromReg = from->as_Register(); - } else { - int st_off = from->reg2stack() * VMRegImpl::stack_slot_size + wordSize; - movq(r10, Address(rsp, st_off)); - fromReg = r10; - } +#ifdef ASSERT + bool progress = false; + const int start_offset = offset(); +#endif + Register fromReg = noreg; ScalarizedInlineArgsStream stream(sig, sig_index, to, to_count, to_index, -1); bool done = true; bool mark_done = true; @@ -5681,22 +5678,31 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in assert(toReg->is_valid(), "destination must be valid"); int off = sig->at(stream.sig_index())._offset; assert(off > 0, "offset in object should be positive"); - Address fromAddr = Address(fromReg, off); int idx = (int)toReg->value(); if (reg_state[idx] == reg_readonly) { - if (idx != from->value()) { - mark_done = false; - } - done = false; - continue; + if (idx != from->value()) { + mark_done = false; + } + done = false; + continue; } else if (reg_state[idx] == reg_written) { continue; - } else { - assert(reg_state[idx] == reg_writable, "must be writable"); - reg_state[idx] = reg_written; } + assert(reg_state[idx] == reg_writable, "must be writable"); + reg_state[idx] = reg_written; + DEBUG_ONLY(progress = true); + if (fromReg == noreg) { + if (from->is_reg()) { + fromReg = from->as_Register(); + } else { + int st_off = from->reg2stack() * VMRegImpl::stack_slot_size + wordSize; + movq(r10, Address(rsp, st_off)); + fromReg = r10; + } + } + Address fromAddr = Address(fromReg, off); if (!toReg->is_XMMRegister()) { Register dst = toReg->is_stack() ? r13 : toReg->as_Register(); if (is_reference_type(bt)) { @@ -5724,6 +5730,7 @@ bool MacroAssembler::unpack_inline_helper(const GrowableArray<SigEntry>* sig, in reg_state[from->value()] = reg_writable; } from_index--; + assert(progress || (start_offset == offset()), "should not emit code"); return done; } diff --git a/test/hotspot/jtreg/ProblemList.txt b/test/hotspot/jtreg/ProblemList.txt index 38f0528cc75..3ae80f5b64e 100644 --- a/test/hotspot/jtreg/ProblemList.txt +++ b/test/hotspot/jtreg/ProblemList.txt @@ -74,9 +74,6 @@ compiler/whitebox/MakeMethodNotCompilableTest.java 8265360 macosx-aarch64 compiler/codecache/jmx/PoolsIndependenceTest.java 8264632 macosx-generic compiler/codecache/TestStressCodeBuffers.java 8272094 generic-aarch64 -# Valhalla -compiler/valhalla/inlinetypes/TestCallingConvention.java 8281325 generic-all - ############################################################################# # :hotspot_gc