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