src/share/vm/opto/callGenerator.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/callGenerator.cpp

Print this page
rev 5645 : 8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed
Summary: type methods shouldn't always operate on speculative part
Reviewed-by:


 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   {


src/share/vm/opto/callGenerator.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File