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 |