Skip to content

Commit 559ebb7

Browse files
committed
Merge tag 'jdk-23.0.1+11' into sapmachine23
2 parents 844db49 + a3fde48 commit 559ebb7

File tree

98 files changed

+4359
-542
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+4359
-542
lines changed

.jcheck/conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[general]
2-
project=jdk
2+
project=jdk-updates
33
jbs=JDK
4-
version=23
4+
version=23.0.1
55

66
[checks]
77
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists

make/conf/version-numbers.conf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@
2828

2929
DEFAULT_VERSION_FEATURE=23
3030
DEFAULT_VERSION_INTERIM=0
31-
DEFAULT_VERSION_UPDATE=0
31+
DEFAULT_VERSION_UPDATE=1
3232
DEFAULT_VERSION_PATCH=0
3333
DEFAULT_VERSION_EXTRA1=0
3434
DEFAULT_VERSION_EXTRA2=0
3535
DEFAULT_VERSION_EXTRA3=0
36-
DEFAULT_VERSION_DATE=2024-09-17
36+
DEFAULT_VERSION_DATE=2024-10-15
3737
DEFAULT_VERSION_CLASSFILE_MAJOR=67 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
3838
DEFAULT_VERSION_CLASSFILE_MINOR=0
3939
DEFAULT_VERSION_DOCS_API_SINCE=11

src/hotspot/cpu/riscv/assembler_riscv.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1828,10 +1828,12 @@ enum Nf {
18281828
// Vector unordered indexed load instructions
18291829
INSN( vluxei8_v, 0b0000111, 0b000, 0b01, 0b0);
18301830
INSN(vluxei32_v, 0b0000111, 0b110, 0b01, 0b0);
1831+
INSN(vluxei64_v, 0b0000111, 0b111, 0b01, 0b0);
18311832

18321833
// Vector unordered indexed store instructions
18331834
INSN( vsuxei8_v, 0b0100111, 0b000, 0b01, 0b0);
18341835
INSN(vsuxei32_v, 0b0100111, 0b110, 0b01, 0b0);
1836+
INSN(vsuxei64_v, 0b0100111, 0b111, 0b01, 0b0);
18351837

18361838
#undef INSN
18371839

src/hotspot/cpu/riscv/riscv_v.ad

Lines changed: 82 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4795,12 +4795,11 @@ instruct vcountTrailingZeros(vReg dst, vReg src) %{
47954795

47964796
// ------------------------------ Vector Load Gather ---------------------------
47974797

4798-
instruct gather_load(vReg dst, indirect mem, vReg idx) %{
4799-
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
4800-
type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4798+
instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{
4799+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
48014800
match(Set dst (LoadVectorGather mem idx));
48024801
effect(TEMP_DEF dst);
4803-
format %{ "gather_load $dst, $mem, $idx" %}
4802+
format %{ "gather_loadS $dst, $mem, $idx" %}
48044803
ins_encode %{
48054804
__ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
48064805
BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4813,12 +4812,28 @@ instruct gather_load(vReg dst, indirect mem, vReg idx) %{
48134812
ins_pipe(pipe_slow);
48144813
%}
48154814

4816-
instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4817-
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4 ||
4818-
type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4815+
instruct gather_loadD(vReg dst, indirect mem, vReg idx) %{
4816+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4817+
match(Set dst (LoadVectorGather mem idx));
4818+
effect(TEMP_DEF dst);
4819+
format %{ "gather_loadD $dst, $mem, $idx" %}
4820+
ins_encode %{
4821+
BasicType bt = Matcher::vector_element_basic_type(this);
4822+
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4823+
__ vsetvli_helper(bt, Matcher::vector_length(this));
4824+
__ vzext_vf2(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
4825+
__ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew);
4826+
__ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
4827+
as_VectorRegister($dst$$reg));
4828+
%}
4829+
ins_pipe(pipe_slow);
4830+
%}
4831+
4832+
instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4833+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 4);
48194834
match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
48204835
effect(TEMP_DEF dst, TEMP tmp);
4821-
format %{ "gather_load_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
4836+
format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
48224837
ins_encode %{
48234838
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48244839
BasicType bt = Matcher::vector_element_basic_type(this);
@@ -4833,14 +4848,32 @@ instruct gather_load_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vR
48334848
ins_pipe(pipe_slow);
48344849
%}
48354850

4851+
instruct gather_loadD_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4852+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n)) == 8);
4853+
match(Set dst (LoadVectorGatherMasked mem (Binary idx v0)));
4854+
effect(TEMP_DEF dst, TEMP tmp);
4855+
format %{ "gather_loadD_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
4856+
ins_encode %{
4857+
BasicType bt = Matcher::vector_element_basic_type(this);
4858+
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4859+
__ vsetvli_helper(bt, Matcher::vector_length(this));
4860+
__ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4861+
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4862+
__ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg),
4863+
as_VectorRegister($dst$$reg));
4864+
__ vluxei64_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
4865+
as_VectorRegister($tmp$$reg), Assembler::v0_t);
4866+
%}
4867+
ins_pipe(pipe_slow);
4868+
%}
4869+
48364870
// ------------------------------ Vector Store Scatter -------------------------
48374871

4838-
instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
4839-
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
4840-
type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4872+
instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{
4873+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
48414874
match(Set mem (StoreVectorScatter mem (Binary src idx)));
48424875
effect(TEMP tmp);
4843-
format %{ "scatter_store $mem, $idx, $src\t# KILL $tmp" %}
4876+
format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
48444877
ins_encode %{
48454878
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48464879
BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4853,12 +4886,28 @@ instruct scatter_store(indirect mem, vReg src, vReg idx, vReg tmp) %{
48534886
ins_pipe(pipe_slow);
48544887
%}
48554888

4856-
instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4857-
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4 ||
4858-
type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4889+
instruct scatter_storeD(indirect mem, vReg src, vReg idx, vReg tmp) %{
4890+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4891+
match(Set mem (StoreVectorScatter mem (Binary src idx)));
4892+
effect(TEMP tmp);
4893+
format %{ "scatter_storeD $mem, $idx, $src\t# KILL $tmp" %}
4894+
ins_encode %{
4895+
BasicType bt = Matcher::vector_element_basic_type(this, $src);
4896+
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4897+
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
4898+
__ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4899+
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4900+
__ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
4901+
as_VectorRegister($tmp$$reg));
4902+
%}
4903+
ins_pipe(pipe_slow);
4904+
%}
4905+
4906+
instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4907+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 4);
48594908
match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
48604909
effect(TEMP tmp);
4861-
format %{ "scatter_store_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
4910+
format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
48624911
ins_encode %{
48634912
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
48644913
BasicType bt = Matcher::vector_element_basic_type(this, $src);
@@ -4871,6 +4920,23 @@ instruct scatter_store_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0,
48714920
ins_pipe(pipe_slow);
48724921
%}
48734922

4923+
instruct scatter_storeD_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0, vReg tmp) %{
4924+
predicate(type2aelembytes(Matcher::vector_element_basic_type(n->in(3)->in(1))) == 8);
4925+
match(Set mem (StoreVectorScatterMasked mem (Binary src (Binary idx v0))));
4926+
effect(TEMP tmp);
4927+
format %{ "scatter_storeD_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
4928+
ins_encode %{
4929+
BasicType bt = Matcher::vector_element_basic_type(this, $src);
4930+
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
4931+
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
4932+
__ vzext_vf2(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
4933+
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
4934+
__ vsuxei64_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
4935+
as_VectorRegister($tmp$$reg), Assembler::v0_t);
4936+
%}
4937+
ins_pipe(pipe_slow);
4938+
%}
4939+
48744940
// ------------------------------ Populate Index to a Vector -------------------
48754941

48764942
instruct populateindex(vReg dst, iRegIorL2I src1, iRegIorL2I src2, vReg tmp) %{

src/hotspot/share/cds/archiveHeapLoader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "memory/iterator.inline.hpp"
3535
#include "memory/resourceArea.hpp"
3636
#include "memory/universe.hpp"
37+
#include "sanitizers/ub.hpp"
3738
#include "utilities/bitMap.inline.hpp"
3839
#include "utilities/copy.hpp"
3940

@@ -61,6 +62,7 @@ ptrdiff_t ArchiveHeapLoader::_mapped_heap_delta = 0;
6162

6263
// Every mapped region is offset by _mapped_heap_delta from its requested address.
6364
// See FileMapInfo::heap_region_requested_address().
65+
ATTRIBUTE_NO_UBSAN
6466
void ArchiveHeapLoader::init_mapped_heap_info(address mapped_heap_bottom, ptrdiff_t delta, int dumptime_oop_shift) {
6567
assert(!_mapped_heap_relocation_initialized, "only once");
6668
if (!UseCompressedOops) {

src/hotspot/share/classfile/verifier.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "classfile/stackMapTableFormat.hpp"
3333
#include "classfile/symbolTable.hpp"
3434
#include "classfile/systemDictionary.hpp"
35+
#include "classfile/systemDictionaryShared.hpp"
3536
#include "classfile/verifier.hpp"
3637
#include "classfile/vmClasses.hpp"
3738
#include "classfile/vmSymbols.hpp"
@@ -212,6 +213,11 @@ bool Verifier::verify(InstanceKlass* klass, bool should_verify_class, TRAPS) {
212213
exception_name == vmSymbols::java_lang_ClassFormatError())) {
213214
log_info(verification)("Fail over class verification to old verifier for: %s", klass->external_name());
214215
log_info(class, init)("Fail over class verification to old verifier for: %s", klass->external_name());
216+
// Exclude any classes that fail over during dynamic dumping
217+
if (CDSConfig::is_dumping_dynamic_archive()) {
218+
SystemDictionaryShared::warn_excluded(klass, "Failed over class verification while dynamic dumping");
219+
SystemDictionaryShared::set_excluded(klass);
220+
}
215221
message_buffer = NEW_RESOURCE_ARRAY(char, message_buffer_len);
216222
exception_message = message_buffer;
217223
exception_name = inference_verify(

src/hotspot/share/gc/shenandoah/shenandoahBarrierSetNMethod.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,19 @@
3636
#include "runtime/threadWXSetters.inline.hpp"
3737

3838
bool ShenandoahBarrierSetNMethod::nmethod_entry_barrier(nmethod* nm) {
39+
if (!is_armed(nm)) {
40+
// Some other thread got here first and healed the oops
41+
// and disarmed the nmethod. No need to continue.
42+
return true;
43+
}
44+
3945
ShenandoahReentrantLock* lock = ShenandoahNMethod::lock_for_nmethod(nm);
4046
assert(lock != nullptr, "Must be");
4147
ShenandoahReentrantLocker locker(lock);
4248

4349
if (!is_armed(nm)) {
44-
// Some other thread got here first and healed the oops
45-
// and disarmed the nmethod.
50+
// Some other thread managed to complete while we were
51+
// waiting for lock. No need to continue.
4652
return true;
4753
}
4854

src/hotspot/share/gc/shenandoah/shenandoahLock.cpp

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,40 +32,49 @@
3232
#include "runtime/javaThread.hpp"
3333
#include "runtime/os.inline.hpp"
3434

35-
// These are inline variants of Thread::SpinAcquire with optional blocking in VM.
36-
37-
class ShenandoahNoBlockOp : public StackObj {
38-
public:
39-
ShenandoahNoBlockOp(JavaThread* java_thread) {
40-
assert(java_thread == nullptr, "Should not pass anything");
41-
}
42-
};
43-
4435
void ShenandoahLock::contended_lock(bool allow_block_for_safepoint) {
4536
Thread* thread = Thread::current();
4637
if (allow_block_for_safepoint && thread->is_Java_thread()) {
47-
contended_lock_internal<ThreadBlockInVM>(JavaThread::cast(thread));
38+
contended_lock_internal<true>(JavaThread::cast(thread));
4839
} else {
49-
contended_lock_internal<ShenandoahNoBlockOp>(nullptr);
40+
contended_lock_internal<false>(nullptr);
5041
}
5142
}
5243

53-
template<typename BlockOp>
44+
template<bool ALLOW_BLOCK>
5445
void ShenandoahLock::contended_lock_internal(JavaThread* java_thread) {
55-
int ctr = 0;
56-
int yields = 0;
46+
assert(!ALLOW_BLOCK || java_thread != nullptr, "Must have a Java thread when allowing block.");
47+
// Spin this much on multi-processor, do not spin on multi-processor.
48+
int ctr = os::is_MP() ? 0xFF : 0;
49+
// Apply TTAS to avoid more expensive CAS calls if the lock is still held by other thread.
5750
while (Atomic::load(&_state) == locked ||
5851
Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) {
59-
if ((++ctr & 0xFFF) == 0) {
60-
BlockOp block(java_thread);
61-
if (yields > 5) {
62-
os::naked_short_sleep(1);
52+
if (ctr > 0 && !SafepointSynchronize::is_synchronizing()) {
53+
// Lightly contended, spin a little if no safepoint is pending.
54+
SpinPause();
55+
ctr--;
56+
} else if (ALLOW_BLOCK) {
57+
ThreadBlockInVM block(java_thread);
58+
if (SafepointSynchronize::is_synchronizing()) {
59+
// If safepoint is pending, we want to block and allow safepoint to proceed.
60+
// Normally, TBIVM above would block us in its destructor.
61+
//
62+
// But that blocking only happens when TBIVM knows the thread poll is armed.
63+
// There is a window between announcing a safepoint and arming the thread poll
64+
// during which trying to continuously enter TBIVM is counter-productive.
65+
// Under high contention, we may end up going in circles thousands of times.
66+
// To avoid it, we wait here until local poll is armed and then proceed
67+
// to TBVIM exit for blocking. We do not SpinPause, but yield to let
68+
// VM thread to arm the poll sooner.
69+
while (SafepointSynchronize::is_synchronizing() &&
70+
!SafepointMechanism::local_poll_armed(java_thread)) {
71+
os::naked_yield();
72+
}
6373
} else {
6474
os::naked_yield();
65-
yields++;
6675
}
6776
} else {
68-
SpinPause();
77+
os::naked_yield();
6978
}
7079
}
7180
}

src/hotspot/share/gc/shenandoah/shenandoahLock.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,20 +37,22 @@ class ShenandoahLock {
3737
shenandoah_padding(0);
3838
volatile LockState _state;
3939
shenandoah_padding(1);
40-
volatile Thread* _owner;
40+
Thread* volatile _owner;
4141
shenandoah_padding(2);
4242

43-
template<typename BlockOp>
43+
template<bool ALLOW_BLOCK>
4444
void contended_lock_internal(JavaThread* java_thread);
45-
4645
public:
4746
ShenandoahLock() : _state(unlocked), _owner(nullptr) {};
4847

4948
void lock(bool allow_block_for_safepoint) {
5049
assert(Atomic::load(&_owner) != Thread::current(), "reentrant locking attempt, would deadlock");
5150

52-
// Try to lock fast, or dive into contended lock handling.
53-
if (Atomic::cmpxchg(&_state, unlocked, locked) != unlocked) {
51+
if ((allow_block_for_safepoint && SafepointSynchronize::is_synchronizing()) ||
52+
(Atomic::cmpxchg(&_state, unlocked, locked) != unlocked)) {
53+
// 1. Java thread, and there is a pending safepoint. Dive into contended locking
54+
// immediately without trying anything else, and block.
55+
// 2. Fast lock fails, dive into contended lock handling.
5456
contended_lock(allow_block_for_safepoint);
5557
}
5658

0 commit comments

Comments
 (0)