comparison src/share/vm/opto/cfgnode.cpp @ 853:64219d2a6493

6851282: JIT miscompilation results in null entry in array when using CompressedOops Summary: Get type for new Phi from non dead path. Reviewed-by: never
author kvn
date Thu, 16 Jul 2009 16:29:55 -0700
parents 7bb995fbd3c0
children 433f394ab509
comparison
equal deleted inserted replaced
851:fc4be448891f 853:64219d2a6493
1794 bool has_decodeN = false; 1794 bool has_decodeN = false;
1795 Node* in_decodeN = NULL; 1795 Node* in_decodeN = NULL;
1796 for (uint i=1; i<req(); ++i) {// For all paths in 1796 for (uint i=1; i<req(); ++i) {// For all paths in
1797 Node *ii = in(i); 1797 Node *ii = in(i);
1798 if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) { 1798 if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) {
1799 has_decodeN = true; 1799 // Note: in_decodeN is used only to define the type of new phi.
1800 in_decodeN = ii->in(1); 1800 // Find a non dead path otherwise phi type will be wrong.
1801 if (ii->in(1)->bottom_type() != Type::TOP) {
1802 has_decodeN = true;
1803 in_decodeN = ii->in(1);
1804 }
1801 } else if (!ii->is_Phi()) { 1805 } else if (!ii->is_Phi()) {
1802 may_push = false; 1806 may_push = false;
1803 } 1807 }
1804 } 1808 }
1805 1809
1806 if (has_decodeN && may_push) { 1810 if (has_decodeN && may_push) {
1807 PhaseIterGVN *igvn = phase->is_IterGVN(); 1811 PhaseIterGVN *igvn = phase->is_IterGVN();
1808 // Note: in_decodeN is used only to define the type of new phi here.
1809 PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN); 1812 PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN);
1810 uint orig_cnt = req(); 1813 uint orig_cnt = req();
1811 for (uint i=1; i<req(); ++i) {// For all paths in 1814 for (uint i=1; i<req(); ++i) {// For all paths in
1812 Node *ii = in(i); 1815 Node *ii = in(i);
1813 Node* new_ii = NULL; 1816 Node* new_ii = NULL;