< prev index next >

src/hotspot/share/opto/idealKit.cpp

Print this page




 471   }
 472 
 473   Node* join_io    = join->in(TypeFunc::I_O);
 474   Node* merging_io = merging->in(TypeFunc::I_O);
 475   if (join_io != merging_io) {
 476     PhiNode* phi;
 477     if (join_io->is_Phi() && join_io->as_Phi()->region() == join_region) {
 478       phi = join_io->as_Phi();
 479     } else {
 480       phi = PhiNode::make(join_region, join_io, Type::ABIO);
 481       phi = (PhiNode*) delay_transform(phi);
 482       join->set_req(TypeFunc::I_O, phi);
 483     }
 484     phi->set_req(slot, merging_io);
 485   }
 486 }
 487 
 488 
 489 //----------------------------- make_call  ----------------------------
 490 // Trivial runtime call
 491 void IdealKit::make_leaf_call(const TypeFunc *slow_call_type,
 492                               address slow_call,
 493                               const char *leaf_name,
 494                               Node* parm0,
 495                               Node* parm1,
 496                               Node* parm2,
 497                               Node* parm3) {
 498 
 499   // We only handle taking in RawMem and modifying RawMem
 500   const TypePtr* adr_type = TypeRawPtr::BOTTOM;
 501   uint adr_idx = C->get_alias_index(adr_type);
 502 
 503   // Slow-path leaf call
 504   CallNode *call =  (CallNode*)new CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
 505 
 506   // Set fixed predefined input arguments
 507   call->init_req( TypeFunc::Control, ctrl() );
 508   call->init_req( TypeFunc::I_O    , top() )     ;   // does no i/o
 509   // Narrow memory as only memory input
 510   call->init_req( TypeFunc::Memory , memory(adr_idx));
 511   call->init_req( TypeFunc::FramePtr, top() /* frameptr() */ );
 512   call->init_req( TypeFunc::ReturnAdr, top() );
 513 
 514   if (parm0 != NULL)  call->init_req(TypeFunc::Parms+0, parm0);
 515   if (parm1 != NULL)  call->init_req(TypeFunc::Parms+1, parm1);
 516   if (parm2 != NULL)  call->init_req(TypeFunc::Parms+2, parm2);
 517   if (parm3 != NULL)  call->init_req(TypeFunc::Parms+3, parm3);
 518 
 519   // Node *c = _gvn.transform(call);
 520   call = (CallNode *) _gvn.transform(call);
 521   Node *c = call; // dbx gets confused with call call->dump()
 522 
 523   // Slow leaf call has no side-effects, sets few values
 524 
 525   set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
 526 
 527   // Make memory for the call
 528   Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
 529 
 530   // Set the RawPtr memory state only.
 531   set_memory(mem, adr_idx);
 532 
 533   assert(C->alias_type(call->adr_type()) == C->alias_type(adr_type),
 534          "call node must be constructed correctly");






 535 }
 536 
 537 void IdealKit::make_leaf_call_no_fp(const TypeFunc *slow_call_type,
 538                               address slow_call,
 539                               const char *leaf_name,
 540                               const TypePtr* adr_type,
 541                               Node* parm0,
 542                               Node* parm1,
 543                               Node* parm2,
 544                               Node* parm3) {
 545 
 546   // We only handle taking in RawMem and modifying RawMem
 547   uint adr_idx = C->get_alias_index(adr_type);
 548 
 549   // Slow-path leaf call
 550   CallNode *call =  (CallNode*)new CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
 551 
 552   // Set fixed predefined input arguments
 553   call->init_req( TypeFunc::Control, ctrl() );
 554   call->init_req( TypeFunc::I_O    , top() )     ;   // does no i/o




 471   }
 472 
 473   Node* join_io    = join->in(TypeFunc::I_O);
 474   Node* merging_io = merging->in(TypeFunc::I_O);
 475   if (join_io != merging_io) {
 476     PhiNode* phi;
 477     if (join_io->is_Phi() && join_io->as_Phi()->region() == join_region) {
 478       phi = join_io->as_Phi();
 479     } else {
 480       phi = PhiNode::make(join_region, join_io, Type::ABIO);
 481       phi = (PhiNode*) delay_transform(phi);
 482       join->set_req(TypeFunc::I_O, phi);
 483     }
 484     phi->set_req(slot, merging_io);
 485   }
 486 }
 487 
 488 
 489 //----------------------------- make_call  ----------------------------
 490 // Trivial runtime call
 491 Node* IdealKit::make_leaf_call(const TypeFunc *slow_call_type,
 492                                address slow_call,
 493                                const char *leaf_name,
 494                                Node* parm0,
 495                                Node* parm1,
 496                                Node* parm2,
 497                                Node* parm3) {
 498 
 499   // We only handle taking in RawMem and modifying RawMem
 500   const TypePtr* adr_type = TypeRawPtr::BOTTOM;
 501   uint adr_idx = C->get_alias_index(adr_type);
 502 
 503   // Slow-path leaf call
 504   CallNode *call =  (CallNode*)new CallLeafNode( slow_call_type, slow_call, leaf_name, adr_type);
 505 
 506   // Set fixed predefined input arguments
 507   call->init_req( TypeFunc::Control, ctrl() );
 508   call->init_req( TypeFunc::I_O    , top() )     ;   // does no i/o
 509   // Narrow memory as only memory input
 510   call->init_req( TypeFunc::Memory , memory(adr_idx));
 511   call->init_req( TypeFunc::FramePtr, top() /* frameptr() */ );
 512   call->init_req( TypeFunc::ReturnAdr, top() );
 513 
 514   if (parm0 != NULL)  call->init_req(TypeFunc::Parms+0, parm0);
 515   if (parm1 != NULL)  call->init_req(TypeFunc::Parms+1, parm1);
 516   if (parm2 != NULL)  call->init_req(TypeFunc::Parms+2, parm2);
 517   if (parm3 != NULL)  call->init_req(TypeFunc::Parms+3, parm3);
 518 
 519   // Node *c = _gvn.transform(call);
 520   call = (CallNode *) _gvn.transform(call);
 521   Node *c = call; // dbx gets confused with call call->dump()
 522 
 523   // Slow leaf call has no side-effects, sets few values
 524 
 525   set_ctrl(transform( new ProjNode(call,TypeFunc::Control) ));
 526 
 527   // Make memory for the call
 528   Node* mem = _gvn.transform( new ProjNode(call, TypeFunc::Memory) );
 529 
 530   // Set the RawPtr memory state only.
 531   set_memory(mem, adr_idx);
 532 
 533   assert(C->alias_type(call->adr_type()) == C->alias_type(adr_type),
 534          "call node must be constructed correctly");
 535   Node* res = NULL;
 536   if (slow_call_type->range()->cnt() > TypeFunc::Parms) {
 537     assert(slow_call_type->range()->cnt() == TypeFunc::Parms+1, "only one return value");
 538     res = transform(new ProjNode(call, TypeFunc::Parms));
 539   }
 540   return res;
 541 }
 542 
 543 void IdealKit::make_leaf_call_no_fp(const TypeFunc *slow_call_type,
 544                               address slow_call,
 545                               const char *leaf_name,
 546                               const TypePtr* adr_type,
 547                               Node* parm0,
 548                               Node* parm1,
 549                               Node* parm2,
 550                               Node* parm3) {
 551 
 552   // We only handle taking in RawMem and modifying RawMem
 553   uint adr_idx = C->get_alias_index(adr_type);
 554 
 555   // Slow-path leaf call
 556   CallNode *call =  (CallNode*)new CallLeafNoFPNode( slow_call_type, slow_call, leaf_name, adr_type);
 557 
 558   // Set fixed predefined input arguments
 559   call->init_req( TypeFunc::Control, ctrl() );
 560   call->init_req( TypeFunc::I_O    , top() )     ;   // does no i/o


< prev index next >