< prev index next >
src/share/vm/opto/cfgnode.cpp
Print this page
*** 1631,1651 ****
if( phase->type_or_null(r) == Type::TOP ) // Dead code?
return NULL; // No change
// If all inputs are value types, push the value type node down through the
// phi because value type nodes should be merged through their input values.
! bool all_vt = true;
! for (uint i = 1; i < req() && all_vt; ++i) {
! all_vt = in(i) && in(i)->is_ValueType();
}
! if (req() > 2 && all_vt) {
! ValueTypeNode* vt = in(1)->as_ValueType()->clone_with_phis(phase, in(0));
for (uint i = 2; i < req(); ++i) {
vt->merge_with(phase, in(i)->as_ValueType(), i, i == (req()-1));
}
return vt;
}
Node *top = phase->C->top();
bool new_phi = (outcnt() == 0); // transforming new Phi
// No change for igvn if new phi is not hooked
if (new_phi && can_reshape)
--- 1631,1654 ----
if( phase->type_or_null(r) == Type::TOP ) // Dead code?
return NULL; // No change
// If all inputs are value types, push the value type node down through the
// phi because value type nodes should be merged through their input values.
! if (req() > 2 && in(1) && in(1)->is_ValueTypeBase()) {
! int opcode = in(1)->Opcode();
! uint i = 2;
! for (; i < req() && in(i) && in(i)->is_ValueTypeBase(); i++) {
! assert(in(i)->Opcode() == opcode, "mixing pointers and values?");
}
! if (i == req()) {
! ValueTypeBaseNode* vt = in(1)->as_ValueTypeBase()->clone_with_phis(phase, in(0));
for (uint i = 2; i < req(); ++i) {
vt->merge_with(phase, in(i)->as_ValueType(), i, i == (req()-1));
}
return vt;
}
+ }
Node *top = phase->C->top();
bool new_phi = (outcnt() == 0); // transforming new Phi
// No change for igvn if new phi is not hooked
if (new_phi && can_reshape)
< prev index next >