EVALUATION
The problem at the same place as in 6851282.
The new Phi narrow type is incorrect for the next case since it is based on the type of one of inputs
which could be subtype:
2910 ConN === 0 [[ 2854 ]] #narrowoop: precise klass DoubletonList: 0x00000000008101f8:Constant:exact *
2911 ConN === 0 [[ 2853 ]] #narrowoop: precise klass SingletonList: 0x0000000000810118:Constant:exact *
2854 DecodeN === _ 2910 [[ 2869 ]] #klass AbstractMemoryEfficientList: 0x00000000008546b8 * Klass:klass AbstractMemoryEfficientList: 0x00000000008546b8 * !orig=[1876] !jvms: AbstractMemoryEfficientList::equals @ bci:53 AbstractList::equals @ bci:-1
2853 DecodeN === _ 2911 [[ 2869 ]] #klass AbstractMemoryEfficientList: 0x00000000008546b8 * Klass:klass AbstractMemoryEfficientList: 0x00000000008546b8 * !orig=[1876] !jvms: AbstractMemoryEfficientList::equals @ bci:53 AbstractList::equals @ bci:-1
2869 Phi === 2862 2853 2854 [[ 2858 2856 ]] #klass AbstractMemoryEfficientList: 0x00000000008546b8 * Klass:klass AbstractMemoryEfficientList: 0x00000000008546b8 * !orig=[2852],[1876] !jvms: AbstractMemoryEfficientList::equals @ bci:53 AbstractList::equals @ bci:-1
After the optimization in PhiNode::Ideal we will get new Phi with incorrect type:
2910 ConN === 0 [[ 2854 2916 ]] #narrowoop: precise klass DoubletonList: 0x00000000008101f8:Constant:exact *
2911 ConN === 0 [[ 2853 2916 ]] #narrowoop: precise klass SingletonList: 0x0000000000810118:Constant:exact *
2916 Phi === 2862 2911 2910 [[ 2917 ]] #narrowoop: precise klass DoubletonList: 0x00000000008101f8:Constant:exact * !orig=2869,[2852],[1876] !jvms: AbstractMemoryEfficientList::equals @ bci:53 AbstractList::equals @ bci:-1
The Phi is used in Cmp node and as result of wrong type the result of Cmp is wrong. It leads to incorrect graph and generated code.
|
SUGGESTED FIX
src/share/vm/opto/cfgnode.cpp Wed Jul 29 18:27:17 2009 -0700
@@ -1792,15 +1792,12 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bo
if (UseCompressedOops && can_reshape && progress == NULL) {
bool may_push = true;
bool has_decodeN = false;
- Node* in_decodeN = NULL;
for (uint i=1; i<req(); ++i) {// For all paths in
Node *ii = in(i);
if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) {
- // Note: in_decodeN is used only to define the type of new phi.
- // Find a non dead path otherwise phi type will be wrong.
+ // Do optimization if a non dead path exist.
if (ii->in(1)->bottom_type() != Type::TOP) {
has_decodeN = true;
- in_decodeN = ii->in(1);
}
} else if (!ii->is_Phi()) {
may_push = false;
@@ -1809,7 +1806,9 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bo
if (has_decodeN && may_push) {
PhaseIterGVN *igvn = phase->is_IterGVN();
- PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN);
+ // Make narrow type for new phi.
+ const Type* narrow_t = TypeNarrowOop::make(this->bottom_type()->is_ptr());
+ PhiNode* new_phi = new (phase->C, r->req()) PhiNode(r, narrow_t);
uint orig_cnt = req();
for (uint i=1; i<req(); ++i) {// For all paths in
Node *ii = in(i);
@@ -1822,7 +1821,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bo
if (ii->as_Phi() == this) {
new_ii = new_phi;
} else {
- new_ii = new (phase->C, 2) EncodePNode(ii, in_decodeN->bottom_type());
+ new_ii = new (phase->C, 2) EncodePNode(ii, narrow_t);
igvn->register_new_node_with_optimizer(new_ii);
}
}
|