Mercurial > hg > graal-jvmci-8
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) { |