< prev index next >

src/hotspot/share/opto/matcher.cpp

Print this page

        

*** 39,48 **** --- 39,51 ---- #include "opto/type.hpp" #include "opto/vectornode.hpp" #include "runtime/os.hpp" #include "runtime/sharedRuntime.hpp" #include "utilities/align.hpp" + #if INCLUDE_ZGC + #include "gc/z/zBarrierSetRuntime.hpp" + #endif // INCLUDE_ZGC OptoReg::Name OptoReg::c_frame_pointer; const RegMask *Matcher::idealreg2regmask[_last_machine_leaf]; RegMask Matcher::mreg2regmask[_last_Mach_Reg];
*** 2060,2069 **** --- 2063,2073 ---- } if (nstate == Visit) { mstack.set_state(Post_Visit); set_visited(n); // Flag as visited now bool mem_op = false; + int mem_addr_idx = MemNode::Address; switch( nop ) { // Handle some opcodes special case Op_Phi: // Treat Phis as shared roots case Op_Parm: case Op_Proj: // All handled specially during matching
*** 2148,2157 **** --- 2152,2172 ---- break; case Op_ClearArray: case Op_SafePoint: mem_op = true; break; + #if INCLUDE_ZGC + case Op_CallLeaf: + if (UseZGC) { + if (n->as_Call()->entry_point() == ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr() || + n->as_Call()->entry_point() == ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr()) { + mem_op = true; + mem_addr_idx = TypeFunc::Parms+1; + } + break; + } + #endif default: if( n->is_Store() ) { // Do match stores, despite no ideal reg mem_op = true; break;
*** 2197,2207 **** continue; } #endif // Clone addressing expressions as they are "free" in memory access instructions ! if (mem_op && i == MemNode::Address && mop == Op_AddP && // When there are other uses besides address expressions // put it on stack and mark as shared. !is_visited(m)) { // Some inputs for address expression are not put on stack // to avoid marking them as shared and forcing them into register --- 2212,2222 ---- continue; } #endif // Clone addressing expressions as they are "free" in memory access instructions ! if (mem_op && i == mem_addr_idx && mop == Op_AddP && // When there are other uses besides address expressions // put it on stack and mark as shared. !is_visited(m)) { // Some inputs for address expression are not put on stack // to avoid marking them as shared and forcing them into register
< prev index next >