705 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
706 RegionNode* region = new (kit.C) RegionNode(3);
707 region->init_req(1, kit.control());
708 region->init_req(2, slow_map->control());
709 kit.set_control(gvn.transform(region));
710 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
711 iophi->set_req(2, slow_map->i_o());
712 kit.set_i_o(gvn.transform(iophi));
713 kit.merge_memory(slow_map->merged_memory(), region, 2);
714 uint tos = kit.jvms()->stkoff() + kit.sp();
715 uint limit = slow_map->req();
716 for (uint i = TypeFunc::Parms; i < limit; i++) {
717 // Skip unused stack slots; fast forward to monoff();
718 if (i == tos) {
719 i = kit.jvms()->monoff();
720 if( i >= limit ) break;
721 }
722 Node* m = kit.map()->in(i);
723 Node* n = slow_map->in(i);
724 if (m != n) {
725 const Type* t = gvn.type(m)->meet(gvn.type(n));
726 Node* phi = PhiNode::make(region, m, t);
727 phi->set_req(2, n);
728 kit.map()->set_req(i, gvn.transform(phi));
729 }
730 }
731 return kit.transfer_exceptions_into_jvms();
732 }
733
734
735 CallGenerator* CallGenerator::for_method_handle_call(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool delayed_forbidden) {
736 assert(callee->is_method_handle_intrinsic() ||
737 callee->is_compiled_lambda_form(), "for_method_handle_call mismatch");
738 bool input_not_const;
739 CallGenerator* cg = CallGenerator::for_method_handle_inline(jvms, caller, callee, input_not_const);
740 Compile* C = Compile::current();
741 if (cg != NULL) {
742 if (!delayed_forbidden && AlwaysIncrementalInline) {
743 return CallGenerator::for_late_inline(callee, cg);
744 } else {
745 return cg;
958 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
959 RegionNode* region = new (kit.C) RegionNode(3);
960 region->init_req(1, kit.control());
961 region->init_req(2, slow_map->control());
962 kit.set_control(gvn.transform(region));
963 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
964 iophi->set_req(2, slow_map->i_o());
965 kit.set_i_o(gvn.transform(iophi));
966 kit.merge_memory(slow_map->merged_memory(), region, 2);
967 uint tos = kit.jvms()->stkoff() + kit.sp();
968 uint limit = slow_map->req();
969 for (uint i = TypeFunc::Parms; i < limit; i++) {
970 // Skip unused stack slots; fast forward to monoff();
971 if (i == tos) {
972 i = kit.jvms()->monoff();
973 if( i >= limit ) break;
974 }
975 Node* m = kit.map()->in(i);
976 Node* n = slow_map->in(i);
977 if (m != n) {
978 const Type* t = gvn.type(m)->meet(gvn.type(n));
979 Node* phi = PhiNode::make(region, m, t);
980 phi->set_req(2, n);
981 kit.map()->set_req(i, gvn.transform(phi));
982 }
983 }
984 return kit.transfer_exceptions_into_jvms();
985 }
986
987 //-------------------------UncommonTrapCallGenerator-----------------------------
988 // Internal class which handles all out-of-line calls checking receiver type.
989 class UncommonTrapCallGenerator : public CallGenerator {
990 Deoptimization::DeoptReason _reason;
991 Deoptimization::DeoptAction _action;
992
993 public:
994 UncommonTrapCallGenerator(ciMethod* m,
995 Deoptimization::DeoptReason reason,
996 Deoptimization::DeoptAction action)
997 : CallGenerator(m)
998 {
|
705 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
706 RegionNode* region = new (kit.C) RegionNode(3);
707 region->init_req(1, kit.control());
708 region->init_req(2, slow_map->control());
709 kit.set_control(gvn.transform(region));
710 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
711 iophi->set_req(2, slow_map->i_o());
712 kit.set_i_o(gvn.transform(iophi));
713 kit.merge_memory(slow_map->merged_memory(), region, 2);
714 uint tos = kit.jvms()->stkoff() + kit.sp();
715 uint limit = slow_map->req();
716 for (uint i = TypeFunc::Parms; i < limit; i++) {
717 // Skip unused stack slots; fast forward to monoff();
718 if (i == tos) {
719 i = kit.jvms()->monoff();
720 if( i >= limit ) break;
721 }
722 Node* m = kit.map()->in(i);
723 Node* n = slow_map->in(i);
724 if (m != n) {
725 const Type* t = gvn.type(m)->meet(gvn.type(n), true);
726 Node* phi = PhiNode::make(region, m, t);
727 phi->set_req(2, n);
728 kit.map()->set_req(i, gvn.transform(phi));
729 }
730 }
731 return kit.transfer_exceptions_into_jvms();
732 }
733
734
735 CallGenerator* CallGenerator::for_method_handle_call(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool delayed_forbidden) {
736 assert(callee->is_method_handle_intrinsic() ||
737 callee->is_compiled_lambda_form(), "for_method_handle_call mismatch");
738 bool input_not_const;
739 CallGenerator* cg = CallGenerator::for_method_handle_inline(jvms, caller, callee, input_not_const);
740 Compile* C = Compile::current();
741 if (cg != NULL) {
742 if (!delayed_forbidden && AlwaysIncrementalInline) {
743 return CallGenerator::for_late_inline(callee, cg);
744 } else {
745 return cg;
958 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization
959 RegionNode* region = new (kit.C) RegionNode(3);
960 region->init_req(1, kit.control());
961 region->init_req(2, slow_map->control());
962 kit.set_control(gvn.transform(region));
963 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO);
964 iophi->set_req(2, slow_map->i_o());
965 kit.set_i_o(gvn.transform(iophi));
966 kit.merge_memory(slow_map->merged_memory(), region, 2);
967 uint tos = kit.jvms()->stkoff() + kit.sp();
968 uint limit = slow_map->req();
969 for (uint i = TypeFunc::Parms; i < limit; i++) {
970 // Skip unused stack slots; fast forward to monoff();
971 if (i == tos) {
972 i = kit.jvms()->monoff();
973 if( i >= limit ) break;
974 }
975 Node* m = kit.map()->in(i);
976 Node* n = slow_map->in(i);
977 if (m != n) {
978 const Type* t = gvn.type(m)->meet(gvn.type(n), true);
979 Node* phi = PhiNode::make(region, m, t);
980 phi->set_req(2, n);
981 kit.map()->set_req(i, gvn.transform(phi));
982 }
983 }
984 return kit.transfer_exceptions_into_jvms();
985 }
986
987 //-------------------------UncommonTrapCallGenerator-----------------------------
988 // Internal class which handles all out-of-line calls checking receiver type.
989 class UncommonTrapCallGenerator : public CallGenerator {
990 Deoptimization::DeoptReason _reason;
991 Deoptimization::DeoptAction _action;
992
993 public:
994 UncommonTrapCallGenerator(ciMethod* m,
995 Deoptimization::DeoptReason reason,
996 Deoptimization::DeoptAction action)
997 : CallGenerator(m)
998 {
|