< prev index next >

src/share/vm/opto/doCall.cpp

Print this page

        

*** 36,45 **** --- 36,46 ---- #include "opto/mulnode.hpp" #include "opto/parse.hpp" #include "opto/rootnode.hpp" #include "opto/runtime.hpp" #include "opto/subnode.hpp" + #include "opto/valuetypenode.hpp" #include "prims/nativeLookup.hpp" #include "runtime/sharedRuntime.hpp" void trace_type_profile(Compile* C, ciMethod *method, int depth, int bci, ciMethod *prof_method, ciKlass *prof_klass, int site_count, int receiver_count) { if (TraceTypeProfile || C->print_inlining()) {
*** 655,664 **** --- 656,680 ---- Node* retnode = pop(); Node* cast_obj = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type)); push(cast_obj); } } + } else if (rt == T_VALUETYPE) { + assert(ct == T_VALUETYPE, "rt=%s, ct=%s", type2name(rt), type2name(ct)); + if (rtype == C->env()->___Value_klass()) { + const Type* sig_type = TypeOopPtr::make_from_klass(ctype->as_klass()); + Node* retnode = pop(); + Node* cast = _gvn.transform(new CheckCastPPNode(control(), retnode, sig_type)); + Node* vt = ValueTypeNode::make(_gvn, merged_memory(), cast); + push(vt); + } else { + assert(ctype == C->env()->___Value_klass(), "unexpected value type klass"); + Node* retnode = pop(); + assert(retnode->is_ValueType(), "inconsistent"); + retnode = retnode->as_ValueType()->store_to_memory(this); + push(retnode); + } } else { assert(rt == ct, "unexpected mismatch: rt=%s, ct=%s", type2name(rt), type2name(ct)); // push a zero; it's better than getting an oop/int mismatch pop_node(rt); Node* retnode = zerocon(ct);
< prev index next >