comparison src/share/vm/opto/cfgnode.cpp @ 368:36ccc817fca4

6747051: Improve code and implicit null check generation for compressed oops Summary: Push DecodeN node below the Null check to the non-null path to use the mach node without 0 test. Reviewed-by: rasbold, never
author kvn
date Tue, 23 Sep 2008 12:29:06 -0700
parents 194b8e3a2fc4
children cc80376deb0c
comparison
equal deleted inserted replaced
367:194b8e3a2fc4 368:36ccc817fca4
1767 progress = this; 1767 progress = this;
1768 } 1768 }
1769 } 1769 }
1770 } 1770 }
1771 1771
1772 #ifdef _LP64
1773 // Push DecodeN down through phi.
1774 // The rest of phi graph will transform by split EncodeP node though phis up.
1775 if (UseCompressedOops && can_reshape && progress == NULL) {
1776 bool may_push = true;
1777 bool has_decodeN = false;
1778 Node* in_decodeN = NULL;
1779 for (uint i=1; i<req(); ++i) {// For all paths in
1780 Node *ii = in(i);
1781 if (ii->is_DecodeN() && ii->bottom_type() == bottom_type()) {
1782 has_decodeN = true;
1783 in_decodeN = ii->in(1);
1784 } else if (!ii->is_Phi()) {
1785 may_push = false;
1786 }
1787 }
1788
1789 if (has_decodeN && may_push) {
1790 PhaseIterGVN *igvn = phase->is_IterGVN();
1791 // Note: in_decodeN is used only to define the type of new phi here.
1792 PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN);
1793 uint orig_cnt = req();
1794 for (uint i=1; i<req(); ++i) {// For all paths in
1795 Node *ii = in(i);
1796 Node* new_ii = NULL;
1797 if (ii->is_DecodeN()) {
1798 assert(ii->bottom_type() == bottom_type(), "sanity");
1799 new_ii = ii->in(1);
1800 } else {
1801 assert(ii->is_Phi(), "sanity");
1802 if (ii->as_Phi() == this) {
1803 new_ii = new_phi;
1804 } else {
1805 new_ii = new (phase->C, 2) EncodePNode(ii, in_decodeN->bottom_type());
1806 igvn->register_new_node_with_optimizer(new_ii);
1807 }
1808 }
1809 new_phi->set_req(i, new_ii);
1810 }
1811 igvn->register_new_node_with_optimizer(new_phi, this);
1812 progress = new (phase->C, 2) DecodeNNode(new_phi, bottom_type());
1813 }
1814 }
1815 #endif
1816
1772 return progress; // Return any progress 1817 return progress; // Return any progress
1773 } 1818 }
1774 1819
1775 //------------------------------out_RegMask------------------------------------ 1820 //------------------------------out_RegMask------------------------------------
1776 const RegMask &PhiNode::in_RegMask(uint i) const { 1821 const RegMask &PhiNode::in_RegMask(uint i) const {