src/share/vm/opto/cfgnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
*** old/src/share/vm/opto/cfgnode.cpp Mon Sep 22 15:26:20 2008
--- new/src/share/vm/opto/cfgnode.cpp Mon Sep 22 15:26:20 2008
*** 1767,1776 ****
--- 1767,1821 ----
progress = this;
}
}
}
+ #ifdef _LP64
+ // Push DecodeN down through phi.
+ // The rest of phi graph will transform by split EncodeP node though phis up.
+ 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()) {
+ has_decodeN = true;
+ in_decodeN = ii->in(1);
+ } else if (!ii->is_Phi()) {
+ may_push = false;
+ }
+ }
+
+ if (has_decodeN && may_push) {
+ PhaseIterGVN *igvn = phase->is_IterGVN();
+ // Note: in_decodeN is used only to define the type of new phi here.
+ PhiNode *new_phi = PhiNode::make_blank(in(0), in_decodeN);
+ uint orig_cnt = req();
+ for (uint i=1; i<req(); ++i) {// For all paths in
+ Node *ii = in(i);
+ Node* new_ii = NULL;
+ if (ii->is_DecodeN()) {
+ assert(ii->bottom_type() == bottom_type(), "sanity");
+ new_ii = ii->in(1);
+ } else {
+ assert(ii->is_Phi(), "sanity");
+ if (ii->as_Phi() == this) {
+ new_ii = new_phi;
+ } else {
+ new_ii = new (phase->C, 2) EncodePNode(ii, in_decodeN->bottom_type());
+ igvn->register_new_node_with_optimizer(new_ii);
+ }
+ }
+ new_phi->set_req(i, new_ii);
+ }
+ igvn->register_new_node_with_optimizer(new_phi, this);
+ progress = new (phase->C, 2) DecodeNNode(new_phi, bottom_type());
+ }
+ }
+ #endif
+
return progress; // Return any progress
}
//------------------------------out_RegMask------------------------------------
const RegMask &PhiNode::in_RegMask(uint i) const {
src/share/vm/opto/cfgnode.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File