54 int PhaseMacroExpand::replace_input(Node *use, Node *oldref, Node *newref) {
55 int nreplacements = 0;
56 uint req = use->req();
57 for (uint j = 0; j < use->len(); j++) {
58 Node *uin = use->in(j);
59 if (uin == oldref) {
60 if (j < req)
61 use->set_req(j, newref);
62 else
63 use->set_prec(j, newref);
64 nreplacements++;
65 } else if (j >= req && uin == NULL) {
66 break;
67 }
68 }
69 return nreplacements;
70 }
71
72 void PhaseMacroExpand::copy_call_debug_info(CallNode *oldcall, CallNode * newcall) {
73 // Copy debug information and adjust JVMState information
74 uint old_dbg_start = oldcall->tf()->domain()->cnt();
75 uint new_dbg_start = newcall->tf()->domain()->cnt();
76 int jvms_adj = new_dbg_start - old_dbg_start;
77 assert (new_dbg_start == newcall->req(), "argument count mismatch");
78
79 // SafePointScalarObject node could be referenced several times in debug info.
80 // Use Dict to record cloned nodes.
81 Dict* sosn_map = new Dict(cmpkey,hashkey);
82 for (uint i = old_dbg_start; i < oldcall->req(); i++) {
83 Node* old_in = oldcall->in(i);
84 // Clone old SafePointScalarObjectNodes, adjusting their field contents.
85 if (old_in != NULL && old_in->is_SafePointScalarObject()) {
86 SafePointScalarObjectNode* old_sosn = old_in->as_SafePointScalarObject();
87 uint old_unique = C->unique();
88 Node* new_in = old_sosn->clone(sosn_map);
89 if (old_unique != C->unique()) { // New node?
90 new_in->set_req(0, C->root()); // reset control edge
91 new_in = transform_later(new_in); // Register new node.
92 }
93 old_in = new_in;
94 }
95 newcall->add_req(old_in);
|
54 int PhaseMacroExpand::replace_input(Node *use, Node *oldref, Node *newref) {
55 int nreplacements = 0;
56 uint req = use->req();
57 for (uint j = 0; j < use->len(); j++) {
58 Node *uin = use->in(j);
59 if (uin == oldref) {
60 if (j < req)
61 use->set_req(j, newref);
62 else
63 use->set_prec(j, newref);
64 nreplacements++;
65 } else if (j >= req && uin == NULL) {
66 break;
67 }
68 }
69 return nreplacements;
70 }
71
72 void PhaseMacroExpand::copy_call_debug_info(CallNode *oldcall, CallNode * newcall) {
73 // Copy debug information and adjust JVMState information
74 uint old_dbg_start = oldcall->tf()->domain_sig()->cnt();
75 uint new_dbg_start = newcall->tf()->domain_sig()->cnt();
76 int jvms_adj = new_dbg_start - old_dbg_start;
77 assert (new_dbg_start == newcall->req(), "argument count mismatch");
78
79 // SafePointScalarObject node could be referenced several times in debug info.
80 // Use Dict to record cloned nodes.
81 Dict* sosn_map = new Dict(cmpkey,hashkey);
82 for (uint i = old_dbg_start; i < oldcall->req(); i++) {
83 Node* old_in = oldcall->in(i);
84 // Clone old SafePointScalarObjectNodes, adjusting their field contents.
85 if (old_in != NULL && old_in->is_SafePointScalarObject()) {
86 SafePointScalarObjectNode* old_sosn = old_in->as_SafePointScalarObject();
87 uint old_unique = C->unique();
88 Node* new_in = old_sosn->clone(sosn_map);
89 if (old_unique != C->unique()) { // New node?
90 new_in->set_req(0, C->root()); // reset control edge
91 new_in = transform_later(new_in); // Register new node.
92 }
93 old_in = new_in;
94 }
95 newcall->add_req(old_in);
|