comparison src/share/vm/opto/macro.cpp @ 63:eac007780a58

6671807: (Escape Analysis) Add new ideal node to represent the state of a scalarized object at a safepoint Summary: Values of non-static fields of a scalarized object should be saved in debug info to reallocate the object during deoptimization. Reviewed-by: never
author kvn
date Thu, 13 Mar 2008 16:06:34 -0700
parents a61af66fc99e
children 6dbf1a175d6b
comparison
equal deleted inserted replaced
46:8b6e49187640 63:eac007780a58
52 // Copy debug information and adjust JVMState information 52 // Copy debug information and adjust JVMState information
53 uint old_dbg_start = oldcall->tf()->domain()->cnt(); 53 uint old_dbg_start = oldcall->tf()->domain()->cnt();
54 uint new_dbg_start = newcall->tf()->domain()->cnt(); 54 uint new_dbg_start = newcall->tf()->domain()->cnt();
55 int jvms_adj = new_dbg_start - old_dbg_start; 55 int jvms_adj = new_dbg_start - old_dbg_start;
56 assert (new_dbg_start == newcall->req(), "argument count mismatch"); 56 assert (new_dbg_start == newcall->req(), "argument count mismatch");
57
58 Dict* sosn_map = new Dict(cmpkey,hashkey);
57 for (uint i = old_dbg_start; i < oldcall->req(); i++) { 59 for (uint i = old_dbg_start; i < oldcall->req(); i++) {
58 newcall->add_req(oldcall->in(i)); 60 Node* old_in = oldcall->in(i);
59 } 61 // Clone old SafePointScalarObjectNodes, adjusting their field contents.
62 if (old_in->is_SafePointScalarObject()) {
63 SafePointScalarObjectNode* old_sosn = old_in->as_SafePointScalarObject();
64 uint old_unique = C->unique();
65 Node* new_in = old_sosn->clone(jvms_adj, sosn_map);
66 if (old_unique != C->unique()) {
67 new_in = transform_later(new_in); // Register new node.
68 }
69 old_in = new_in;
70 }
71 newcall->add_req(old_in);
72 }
73
60 newcall->set_jvms(oldcall->jvms()); 74 newcall->set_jvms(oldcall->jvms());
61 for (JVMState *jvms = newcall->jvms(); jvms != NULL; jvms = jvms->caller()) { 75 for (JVMState *jvms = newcall->jvms(); jvms != NULL; jvms = jvms->caller()) {
62 jvms->set_map(newcall); 76 jvms->set_map(newcall);
63 jvms->set_locoff(jvms->locoff()+jvms_adj); 77 jvms->set_locoff(jvms->locoff()+jvms_adj);
64 jvms->set_stkoff(jvms->stkoff()+jvms_adj); 78 jvms->set_stkoff(jvms->stkoff()+jvms_adj);
65 jvms->set_monoff(jvms->monoff()+jvms_adj); 79 jvms->set_monoff(jvms->monoff()+jvms_adj);
80 jvms->set_scloff(jvms->scloff()+jvms_adj);
66 jvms->set_endoff(jvms->endoff()+jvms_adj); 81 jvms->set_endoff(jvms->endoff()+jvms_adj);
67 } 82 }
68 } 83 }
69 84
70 Node* PhaseMacroExpand::opt_iff(Node* region, Node* iff) { 85 Node* PhaseMacroExpand::opt_iff(Node* region, Node* iff) {