--- old/src/cpu/aarch64/vm/templateTable_aarch64.cpp 2017-09-13 22:19:48.977208439 -0700 +++ new/src/cpu/aarch64/vm/templateTable_aarch64.cpp 2017-09-13 22:19:48.891200460 -0700 @@ -2195,6 +2195,13 @@ __ bind(skip_register_finalizer); } + // Explicitly reset last_sp, for handling special case in TemplateInterpreter::deopt_reexecute_entry +#ifdef ASSERT + if (state == vtos) { + __ str(zr, Address(rfp, frame::interpreter_frame_last_sp_offset * wordSize)); + } +#endif + // Issue a StoreStore barrier after all stores but before return // from any constructor for any class with a final field. We don't // know if this is a finalizer, so we always do so. --- old/src/cpu/arm/vm/templateTable_arm.cpp 2017-09-13 22:19:49.346242674 -0700 +++ new/src/cpu/arm/vm/templateTable_arm.cpp 2017-09-13 22:19:49.264235066 -0700 @@ -2844,6 +2844,14 @@ __ bind(skip_register_finalizer); } + // Explicitly reset last_sp, for handling special case in TemplateInterpreter::deopt_reexecute_entry +#if !defined(AARCH64) && defined(ASSERT) + if (state == vtos) { + __ mov(Rtemp, 0); + __ str(Rtemp, Address(FP, frame::interpreter_frame_last_sp_offset * wordSize)); + } +#endif + // Narrow result if state is itos but result type is smaller. // Need to narrow in the return bytecode rather than in generate_return_entry // since compiled code callers expect the result to already be narrowed. --- old/src/cpu/x86/vm/templateTable_x86.cpp 2017-09-13 22:19:49.732278486 -0700 +++ new/src/cpu/x86/vm/templateTable_x86.cpp 2017-09-13 22:19:49.647270600 -0700 @@ -2563,6 +2563,13 @@ __ bind(skip_register_finalizer); } + // Explicitly reset last_sp, for handling special case in TemplateInterpreter::deopt_reexecute_entry +#ifdef ASSERT + if (state == vtos) { + __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); + } +#endif + // Narrow result if state is itos but result type is smaller. // Need to narrow in the return bytecode rather than in generate_return_entry // since compiled code callers expect the result to already be narrowed. --- /dev/null 2017-07-29 03:48:17.651000000 -0700 +++ new/test/compiler/runtime/Test8168712.java 2017-09-13 22:19:50.015304743 -0700 @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @requires vm.simpleArch == "x64" & vm.debug + * @bug 8168712 + * + * @run main/othervm -XX:CompileCommand=compileonly,Test8168712.* -XX:CompileCommand=compileonly,*Object.* -XX:+DTraceMethodProbes -XX:-UseOnStackReplacement -XX:+DeoptimizeRandom compiler.runtime.Test8168712 + */ +package compiler.runtime; + +import java.util.*; + +public class Test8168712 { + static HashSet m = new HashSet<>(); + public static void main(String args[]) { + int i = 0; + while (i++<15000) { + test(); + } + } + static Test8168712 test() { + return new Test8168712(); + } + protected void finalize() { + m.add(this); + } +}