< prev index next >

src/hotspot/share/opto/parse1.cpp

Print this page
rev 47415 : Add Thread Local handshakes and thread local polling


2269   // We do not need to WRITE the memory state after a SafePoint.  The control
2270   // edge will keep card-marks and oop-stores from floating up from below a
2271   // SafePoint and our true dependency added here will keep them from floating
2272   // down below a SafePoint.
2273 
2274   // Clone the current memory state
2275   Node* mem = MergeMemNode::make(map()->memory());
2276 
2277   mem = _gvn.transform(mem);
2278 
2279   // Pass control through the safepoint
2280   sfpnt->init_req(TypeFunc::Control  , control());
2281   // Fix edges normally used by a call
2282   sfpnt->init_req(TypeFunc::I_O      , top() );
2283   sfpnt->init_req(TypeFunc::Memory   , mem   );
2284   sfpnt->init_req(TypeFunc::ReturnAdr, top() );
2285   sfpnt->init_req(TypeFunc::FramePtr , top() );
2286 
2287   // Create a node for the polling address
2288   if( add_poll_param ) {
2289     Node *polladr = ConPNode::make((address)os::get_polling_page());







2290     sfpnt->init_req(TypeFunc::Parms+0, _gvn.transform(polladr));
2291   }
2292 
2293   // Fix up the JVM State edges
2294   add_safepoint_edges(sfpnt);
2295   Node *transformed_sfpnt = _gvn.transform(sfpnt);
2296   set_control(transformed_sfpnt);
2297 
2298   // Provide an edge from root to safepoint.  This makes the safepoint
2299   // appear useful until the parse has completed.
2300   if( OptoRemoveUseless && transformed_sfpnt->is_SafePoint() ) {
2301     assert(C->root() != NULL, "Expect parse is still valid");
2302     C->root()->add_prec(transformed_sfpnt);
2303   }
2304 }
2305 
2306 #ifndef PRODUCT
2307 //------------------------show_parse_info--------------------------------------
2308 void Parse::show_parse_info() {
2309   InlineTree* ilt = NULL;




2269   // We do not need to WRITE the memory state after a SafePoint.  The control
2270   // edge will keep card-marks and oop-stores from floating up from below a
2271   // SafePoint and our true dependency added here will keep them from floating
2272   // down below a SafePoint.
2273 
2274   // Clone the current memory state
2275   Node* mem = MergeMemNode::make(map()->memory());
2276 
2277   mem = _gvn.transform(mem);
2278 
2279   // Pass control through the safepoint
2280   sfpnt->init_req(TypeFunc::Control  , control());
2281   // Fix edges normally used by a call
2282   sfpnt->init_req(TypeFunc::I_O      , top() );
2283   sfpnt->init_req(TypeFunc::Memory   , mem   );
2284   sfpnt->init_req(TypeFunc::ReturnAdr, top() );
2285   sfpnt->init_req(TypeFunc::FramePtr , top() );
2286 
2287   // Create a node for the polling address
2288   if( add_poll_param ) {
2289     Node *polladr;
2290     if (SafepointMechanism::uses_thread_local_poll()) {
2291       Node *thread = _gvn.transform(new ThreadLocalNode());
2292       Node *polling_page_load_addr = _gvn.transform(basic_plus_adr(top(), thread, in_bytes(Thread::polling_page_offset())));
2293       polladr = make_load(control(), polling_page_load_addr, TypeRawPtr::BOTTOM, T_ADDRESS, Compile::AliasIdxRaw, MemNode::unordered);
2294     } else {
2295       polladr = ConPNode::make((address)os::get_polling_page());
2296     }
2297     sfpnt->init_req(TypeFunc::Parms+0, _gvn.transform(polladr));
2298   }
2299 
2300   // Fix up the JVM State edges
2301   add_safepoint_edges(sfpnt);
2302   Node *transformed_sfpnt = _gvn.transform(sfpnt);
2303   set_control(transformed_sfpnt);
2304 
2305   // Provide an edge from root to safepoint.  This makes the safepoint
2306   // appear useful until the parse has completed.
2307   if( OptoRemoveUseless && transformed_sfpnt->is_SafePoint() ) {
2308     assert(C->root() != NULL, "Expect parse is still valid");
2309     C->root()->add_prec(transformed_sfpnt);
2310   }
2311 }
2312 
2313 #ifndef PRODUCT
2314 //------------------------show_parse_info--------------------------------------
2315 void Parse::show_parse_info() {
2316   InlineTree* ilt = NULL;


< prev index next >