< prev index next >

src/share/vm/opto/compile.cpp

Print this page

        

@@ -2709,95 +2709,10 @@
       mem = prev->in(MemNode::Memory);
     }
   }
 }
 
-void Compile::value_type_return_from_mh_intrinsic(CallNode *call, Final_Reshape_Counts &frc) {
-  if (ValueTypeReturnedAsFields &&
-      call->is_CallStaticJava() &&
-      call->as_CallStaticJava()->method() != NULL &&
-      call->as_CallStaticJava()->method()->is_method_handle_intrinsic() &&
-      call->proj_out(TypeFunc::Parms) != NULL &&
-      call->proj_out(TypeFunc::Parms)->bottom_type()->isa_valuetypeptr()) {
-    // A value type is returned from the call but we don't know its
-    // type. One of the values being returned is the klass of the
-    // value type. We need to allocate a value type instance of that
-    // type and initialize it with other values being returned. This
-    // is done with the stub call below that we add right after this
-    // call.
-    Node* ret = call->proj_out(TypeFunc::Parms);
-    assert(ret->bottom_type()->is_valuetypeptr()->klass() == env()->___Value_klass(), "unexpected return type from MH intrinsic");
-    const TypeFunc* tf = call->_tf;
-    const TypeTuple* domain = OptoRuntime::store_value_type_fields_Type()->domain_cc();
-    const TypeFunc* new_tf = TypeFunc::make(tf->domain_sig(), tf->domain_cc(), tf->range_sig(), domain);
-    call->_tf = new_tf;
-
-    CallProjections projs;
-    call->extract_projections(&projs, true, true);
-    Node* ctl = projs.fallthrough_catchproj;
-    Node* mem = projs.fallthrough_memproj;
-    Node* io = projs.fallthrough_ioproj;
-    Node* ex_ctl = projs.catchall_catchproj;
-    Node* ex_mem = projs.catchall_memproj;
-    Node* ex_io = projs.catchall_ioproj;
-    CallStaticJavaNode* rt_call = new CallStaticJavaNode(OptoRuntime::store_value_type_fields_Type(),
-                                                         StubRoutines::store_value_type_fields_to_buf(),
-                                                         "store_value_type_fields",
-                                                         call->jvms()->bci(),
-                                                         TypePtr::BOTTOM);
-    Node* out_ctl = new ProjNode(rt_call, TypeFunc::Control);
-    Node* out_mem = new ProjNode(rt_call, TypeFunc::Memory);
-    Node* out_io = new ProjNode(rt_call, TypeFunc::I_O);
-    Node* res = new ProjNode(rt_call, TypeFunc::Parms);
-
-    Node* catc = new CatchNode(out_ctl, out_io, 2);
-    Node* norm = new CatchProjNode(catc, CatchProjNode::fall_through_index, CatchProjNode::no_handler_bci);
-    Node* excp = new CatchProjNode(catc, CatchProjNode::catch_all_index,    CatchProjNode::no_handler_bci);
-    Node* r = new RegionNode(3);
-    Node* mem_phi = new PhiNode(r, Type::MEMORY, TypePtr::BOTTOM);
-    Node* io_phi = new PhiNode(r, Type::ABIO);
-    r->init_req(1, excp);
-    mem_phi->init_req(1, out_mem);
-    io_phi->init_req(1, out_io);
-
-    frc._visited.set(norm->_idx);
-    frc._visited.set(excp->_idx);
-
-    ctl->replace_by(norm);
-    mem->replace_by(out_mem);
-    io->replace_by(out_io);
-    ret->replace_by(res);
-    ex_ctl->replace_by(r);
-    ex_mem->replace_by(mem_phi);
-    ex_io->replace_by(io_phi);
-
-    r->init_req(2, ex_ctl);
-    mem_phi->init_req(2, ex_mem);
-    io_phi->init_req(2, ex_io);
-
-    rt_call->init_req(TypeFunc::Control, ctl);
-    rt_call->init_req(TypeFunc::Memory, mem);
-    rt_call->init_req(TypeFunc::I_O, io);
-    rt_call->init_req(TypeFunc::FramePtr, call->in(TypeFunc::FramePtr));
-    rt_call->init_req(TypeFunc::ReturnAdr, call->in(TypeFunc::ReturnAdr));
-
-    rt_call->init_req(TypeFunc::Parms, ret);
-    // We don't know how many values are returned. This assumes the
-    // worst case, that all available registers are used.
-    for (uint i = TypeFunc::Parms+1; i < domain->cnt(); i++) {
-      if (domain->field_at(i) == Type::HALF) {
-        rt_call->init_req(i, top());
-        continue;
-      }
-      Node* proj = new ProjNode(call, i);
-      rt_call->init_req(i, proj);
-    }
-
-    // We can safepoint at that new call
-    add_safepoint_edges(rt_call, call->jvms());
-  }
-}
 
 //------------------------------final_graph_reshaping_impl----------------------
 // Implement items 1-5 from final_graph_reshaping below.
 void Compile::final_graph_reshaping_impl( Node *n, Final_Reshape_Counts &frc) {
 

@@ -2909,11 +2824,10 @@
           !n->is_Mem() ) {
         Node *x = n->clone();
         call->set_req( TypeFunc::Parms, x );
       }
     }
-    value_type_return_from_mh_intrinsic(call, frc);
     break;
   }
 
   case Op_StoreD:
   case Op_LoadD:

@@ -3662,19 +3576,21 @@
           }
         }
       }
       // Recheck with a better notion of 'required_outcnt'
       if (n->outcnt() != required_outcnt) {
+        assert(false, "malformed control flow");
         record_method_not_compilable("malformed control flow");
         return true;            // Not all targets reachable!
       }
     }
     // Check that I actually visited all kids.  Unreached kids
     // must be infinite loops.
     for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++)
       if (!frc._visited.test(n->fast_out(j)->_idx)) {
         record_method_not_compilable("infinite loop");
+        assert(false, "infinite loop");
         return true;            // Found unvisited kid; must be unreach
       }
   }
 
   // If original bytecodes contained a mixture of floats and doubles
< prev index next >