Add tests, fix comment

This commit is contained in:
Marc Chevalier 2026-07-30 11:29:19 +02:00
parent f81e5b17d6
commit 3492bf51e7
4 changed files with 66 additions and 6 deletions

View File

@ -406,8 +406,10 @@ inline int frame::sender_sp_ret_address_offset() {
return frame::sender_sp_offset - frame::return_addr_offset;
}
//------------------------------------------------------------------------------
// frame::sender
// This method can be on a hot path. Since Valhalla made it a bit bigger, compilers are
// not as eager to inline it, but in some cases, it makes a significant difference.
// Let's encourage the compiler to inline sender all the way to frame::repair_sender_sp.
// through frame::sender_for_compiled_frame.
ALWAYSINLINE frame frame::sender(RegisterMap* map) const {
frame result = sender_raw(map);

View File

@ -390,9 +390,10 @@ inline int frame::sender_sp_ret_address_offset() {
return frame::sender_sp_offset - frame::return_addr_offset;
}
//------------------------------------------------------------------------------
// frame::sender
// This method can be on a hot path. Since Valhalla made it a bit bigger, compilers are
// not as eager to inline it, but in some cases, it makes a significant difference.
// Let's encourage the compiler to inline sender all the way to frame::repair_sender_sp.
// through frame::sender_for_compiled_frame.
ALWAYSINLINE frame frame::sender(RegisterMap* map) const {
frame result = sender_raw(map);

View File

@ -286,7 +286,7 @@ public:
// Used by shared scope closure (scopedMemoryAccess.cpp)
bool has_scoped_access() const { return (_bits & SCOPED_ACCESS) != 0; }
// Used by shared scope closure (scopedMemoryAccess.cpp)
// Stack has been extended and needs reair. See comment in MacroAssembler::remove_frame
bool needs_stack_repair() const { return (_bits & NEEDS_STACK_REPAIR) != 0; }
};

View File

@ -0,0 +1,57 @@
/*
* Copyright (c) 2026, 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
* @bug 8389130
* @summary With Valhalla, frame::sender became a bit too big and is not as spontaneously inlined as before.
* This causes some measurable performance regressions in cases where walking the stack is frequent.
* @run main/othervm -Xbatch
* -XX:-TieredCompilation
* -XX:CompileCommand=dontinline,${test.main.class}::fillInStackTrace
* ${test.main.class}
* @run main ${test.main.class}
*/
package compiler.exceptions;
public class TestStackWalkPerf extends Throwable {
private static final TestStackWalkPerf PROBE = new TestStackWalkPerf();
private static void fillInStackTrace(int depth, int fills) {
if (depth == 0) {
for (int i = 0; i < fills; i++) {
PROBE.fillInStackTrace();
}
return;
}
fillInStackTrace(depth - 1, fills);
}
public static void main(String[] args) {
for (int i = 0; i < 10_000; i++) {
fillInStackTrace(512, 1);
}
fillInStackTrace(512, 1_000_000);
}
}