From b7375fa6a85e7a3300efcf0d56190126eaca8b92 Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Fri, 18 Oct 2024 15:20:58 +0200 Subject: [PATCH] AArch64 version --- src/hotspot/cpu/aarch64/aarch64.ad | 10 ++++++---- src/hotspot/share/opto/callnode.cpp | 2 +- src/hotspot/share/opto/machnode.cpp | 5 ----- src/hotspot/share/opto/parse1.cpp | 9 +-------- 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/src/hotspot/cpu/aarch64/aarch64.ad b/src/hotspot/cpu/aarch64/aarch64.ad index d9c77a2f52926..aae15e7f08966 100644 --- a/src/hotspot/cpu/aarch64/aarch64.ad +++ b/src/hotspot/cpu/aarch64/aarch64.ad @@ -16020,16 +16020,18 @@ instruct cmpFastUnlockLightweight(rFlagsReg cr, iRegP object, iRegP box, iRegPNo // TODO // provide a near and far version of this code -instruct safePoint(rFlagsReg cr, iRegP poll) +instruct safePoint(rFlagsReg cr) %{ - match(SafePoint poll); + match(SafePoint); effect(KILL cr); format %{ - "ldrw zr, [$poll]\t# Safepoint: poll for GC" + "ldr rscratch1, [rthread, #polling_page_offset]\n\t" + "ldrw zr, [rscratch1]\t# Safepoint: poll for GC" %} ins_encode %{ - __ read_polling_page(as_Register($poll$$reg), relocInfo::poll_type); + __ get_polling_page(rscratch1, relocInfo::poll_type); + __ read_polling_page(rscratch1, relocInfo::poll_type); %} ins_pipe(pipe_serial); // ins_pipe(iload_reg_mem); %} diff --git a/src/hotspot/share/opto/callnode.cpp b/src/hotspot/share/opto/callnode.cpp index e800b3c736bf2..475eb8674aa93 100644 --- a/src/hotspot/share/opto/callnode.cpp +++ b/src/hotspot/share/opto/callnode.cpp @@ -1450,7 +1450,7 @@ Node* SafePointNode::peek_operand(uint off) const { // Do we Match on this edge index or not? Match no edges uint SafePointNode::match_edge(uint idx) const { - return (TypeFunc::Parms == idx); + return 0; } void SafePointNode::disconnect_from_root(PhaseIterGVN *igvn) { diff --git a/src/hotspot/share/opto/machnode.cpp b/src/hotspot/share/opto/machnode.cpp index e271637893b28..3f41b093fc6f3 100644 --- a/src/hotspot/share/opto/machnode.cpp +++ b/src/hotspot/share/opto/machnode.cpp @@ -694,11 +694,6 @@ const RegMask &MachSafePointNode::in_RegMask( uint idx ) const { // _in_rms array of RegMasks. if( idx < TypeFunc::Parms ) return _in_rms[idx]; - if (idx == TypeFunc::Parms && - ideal_Opcode() == Op_SafePoint) { - return MachNode::in_RegMask(idx); - } - // Values outside the domain represent debug info assert(in(idx)->ideal_reg() != Op_RegFlags, "flags register is not spillable"); return *Compile::current()->matcher()->idealreg2spillmask[in(idx)->ideal_reg()]; diff --git a/src/hotspot/share/opto/parse1.cpp b/src/hotspot/share/opto/parse1.cpp index d4a6a9ce5b7a9..420bb443831ae 100644 --- a/src/hotspot/share/opto/parse1.cpp +++ b/src/hotspot/share/opto/parse1.cpp @@ -2235,7 +2235,7 @@ void Parse::return_current(Node* value) { //------------------------------add_safepoint---------------------------------- void Parse::add_safepoint() { - uint parms = TypeFunc::Parms+1; + uint parms = TypeFunc::Parms; // Clear out dead values from the debug info. kill_dead_locals(); @@ -2268,13 +2268,6 @@ void Parse::add_safepoint() { sfpnt->init_req(TypeFunc::ReturnAdr, top() ); sfpnt->init_req(TypeFunc::FramePtr , top() ); - // Create a node for the polling address - Node *polladr; - Node *thread = _gvn.transform(new ThreadLocalNode()); - Node *polling_page_load_addr = _gvn.transform(basic_plus_adr(top(), thread, in_bytes(JavaThread::polling_page_offset()))); - polladr = make_load(control(), polling_page_load_addr, TypeRawPtr::BOTTOM, T_ADDRESS, Compile::AliasIdxRaw, MemNode::unordered); - sfpnt->init_req(TypeFunc::Parms+0, _gvn.transform(polladr)); - // Fix up the JVM State edges add_safepoint_edges(sfpnt); Node *transformed_sfpnt = _gvn.transform(sfpnt);