Merge
This commit is contained in:
commit
93c9356496
@ -1739,6 +1739,7 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
|
|||||||
C->gvn_replace_by(callprojs.fallthrough_catchproj, final_state->in(TypeFunc::Control));
|
C->gvn_replace_by(callprojs.fallthrough_catchproj, final_state->in(TypeFunc::Control));
|
||||||
C->gvn_replace_by(callprojs.fallthrough_memproj, final_state->in(TypeFunc::Memory));
|
C->gvn_replace_by(callprojs.fallthrough_memproj, final_state->in(TypeFunc::Memory));
|
||||||
C->gvn_replace_by(callprojs.fallthrough_ioproj, final_state->in(TypeFunc::I_O));
|
C->gvn_replace_by(callprojs.fallthrough_ioproj, final_state->in(TypeFunc::I_O));
|
||||||
|
Node* final_mem = final_state->in(TypeFunc::Memory);
|
||||||
|
|
||||||
// Replace the result with the new result if it exists and is used
|
// Replace the result with the new result if it exists and is used
|
||||||
if (callprojs.resproj != NULL && result != NULL) {
|
if (callprojs.resproj != NULL && result != NULL) {
|
||||||
@ -1776,6 +1777,21 @@ void GraphKit::replace_call(CallNode* call, Node* result) {
|
|||||||
// Disconnect the call from the graph
|
// Disconnect the call from the graph
|
||||||
call->disconnect_inputs(NULL);
|
call->disconnect_inputs(NULL);
|
||||||
C->gvn_replace_by(call, C->top());
|
C->gvn_replace_by(call, C->top());
|
||||||
|
|
||||||
|
// Clean up any MergeMems that feed other MergeMems since the
|
||||||
|
// optimizer doesn't like that.
|
||||||
|
if (final_mem->is_MergeMem()) {
|
||||||
|
Node_List wl;
|
||||||
|
for (SimpleDUIterator i(final_mem); i.has_next(); i.next()) {
|
||||||
|
Node* m = i.get();
|
||||||
|
if (m->is_MergeMem() && !wl.contains(m)) {
|
||||||
|
wl.push(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (wl.size() > 0) {
|
||||||
|
_gvn.transform(wl.pop());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2417,6 +2417,8 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
|||||||
Node* value = n->in(MemNode::ValueIn);
|
Node* value = n->in(MemNode::ValueIn);
|
||||||
if (!lpt->is_invariant(value)) {
|
if (!lpt->is_invariant(value)) {
|
||||||
msg = "variant store value";
|
msg = "variant store value";
|
||||||
|
} else if (!_igvn.type(n->in(MemNode::Address))->isa_aryptr()) {
|
||||||
|
msg = "not array address";
|
||||||
}
|
}
|
||||||
store = n;
|
store = n;
|
||||||
store_value = value;
|
store_value = value;
|
||||||
@ -2468,6 +2470,7 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
|||||||
// head->phi * elsize + con. head->phi might have a ConvI2L.
|
// head->phi * elsize + con. head->phi might have a ConvI2L.
|
||||||
Node* elements[4];
|
Node* elements[4];
|
||||||
Node* conv = NULL;
|
Node* conv = NULL;
|
||||||
|
bool found_index = false;
|
||||||
int count = store->in(MemNode::Address)->as_AddP()->unpack_offsets(elements, ARRAY_SIZE(elements));
|
int count = store->in(MemNode::Address)->as_AddP()->unpack_offsets(elements, ARRAY_SIZE(elements));
|
||||||
for (int e = 0; e < count; e++) {
|
for (int e = 0; e < count; e++) {
|
||||||
Node* n = elements[e];
|
Node* n = elements[e];
|
||||||
@ -2484,17 +2487,20 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
|||||||
if (value != head->phi()) {
|
if (value != head->phi()) {
|
||||||
msg = "unhandled shift in address";
|
msg = "unhandled shift in address";
|
||||||
} else {
|
} else {
|
||||||
|
found_index = true;
|
||||||
shift = n;
|
shift = n;
|
||||||
assert(type2aelembytes(store->as_Mem()->memory_type(), true) == 1 << shift->in(2)->get_int(), "scale should match");
|
assert(type2aelembytes(store->as_Mem()->memory_type(), true) == 1 << shift->in(2)->get_int(), "scale should match");
|
||||||
}
|
}
|
||||||
} else if (n->Opcode() == Op_ConvI2L && conv == NULL) {
|
} else if (n->Opcode() == Op_ConvI2L && conv == NULL) {
|
||||||
if (n->in(1) == head->phi()) {
|
if (n->in(1) == head->phi()) {
|
||||||
|
found_index = true;
|
||||||
conv = n;
|
conv = n;
|
||||||
} else {
|
} else {
|
||||||
msg = "unhandled input to ConvI2L";
|
msg = "unhandled input to ConvI2L";
|
||||||
}
|
}
|
||||||
} else if (n == head->phi()) {
|
} else if (n == head->phi()) {
|
||||||
// no shift, check below for allowed cases
|
// no shift, check below for allowed cases
|
||||||
|
found_index = true;
|
||||||
} else {
|
} else {
|
||||||
msg = "unhandled node in address";
|
msg = "unhandled node in address";
|
||||||
msg_node = n;
|
msg_node = n;
|
||||||
@ -2506,6 +2512,10 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
|||||||
msg_node = store;
|
msg_node = store;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!found_index) {
|
||||||
|
msg = "missing use of index";
|
||||||
|
}
|
||||||
|
|
||||||
// byte sized items won't have a shift
|
// byte sized items won't have a shift
|
||||||
if (msg == NULL && shift == NULL && t != T_BYTE && t != T_BOOLEAN) {
|
if (msg == NULL && shift == NULL && t != T_BYTE && t != T_BOOLEAN) {
|
||||||
msg = "can't find shift";
|
msg = "can't find shift";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user