src/share/vm/opto/phaseX.cpp
Print this page
*** 1321,1339 ****
if (p != NULL) {
add_users_to_worklist0(p);
}
}
! if( use->is_Cmp() ) { // Enable CMP/BOOL optimization
add_users_to_worklist(use); // Put Bool on worklist
- // Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the
- // phi merging either 0 or 1 onto the worklist
if (use->outcnt() > 0) {
Node* bol = use->raw_out(0);
if (bol->outcnt() > 0) {
Node* iff = bol->raw_out(0);
! if (iff->outcnt() == 2) {
Node* ifproj0 = iff->raw_out(0);
Node* ifproj1 = iff->raw_out(1);
if (ifproj0->outcnt() > 0 && ifproj1->outcnt() > 0) {
Node* region0 = ifproj0->raw_out(0);
Node* region1 = ifproj1->raw_out(0);
--- 1321,1351 ----
if (p != NULL) {
add_users_to_worklist0(p);
}
}
! uint use_op = use->Opcode();
! if(use->is_Cmp()) { // Enable CMP/BOOL optimization
add_users_to_worklist(use); // Put Bool on worklist
if (use->outcnt() > 0) {
Node* bol = use->raw_out(0);
if (bol->outcnt() > 0) {
Node* iff = bol->raw_out(0);
! if (use_op == Op_CmpI &&
! iff->is_CountedLoopEnd()) {
! CountedLoopEndNode* cle = iff->as_CountedLoopEnd();
! if (cle->limit() == n && cle->phi() != NULL) {
! // If an opaque node feeds into the limit condition of a
! // CountedLoop, we need to process the Phi node for the
! // induction variable when the opaque node is removed:
! // the range of values taken by the Phi is now known and
! // so its type is also known.
! _worklist.push(cle->phi());
! }
! } else if (iff->outcnt() == 2) {
! // Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the
! // phi merging either 0 or 1 onto the worklist
Node* ifproj0 = iff->raw_out(0);
Node* ifproj1 = iff->raw_out(1);
if (ifproj0->outcnt() > 0 && ifproj1->outcnt() > 0) {
Node* region0 = ifproj0->raw_out(0);
Node* region1 = ifproj1->raw_out(0);
*** 1341,1353 ****
add_users_to_worklist0(region0);
}
}
}
}
}
- uint use_op = use->Opcode();
// If changed Cast input, check Phi users for simple cycles
if( use->is_ConstraintCast() || use->is_CheckCastPP() ) {
for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
Node* u = use->fast_out(i2);
if (u->is_Phi())
--- 1353,1382 ----
add_users_to_worklist0(region0);
}
}
}
}
+ if (use_op == Op_CmpI) {
+ Node* in1 = use->in(1);
+ for (uint i = 0; i < in1->outcnt(); i++) {
+ if (in1->raw_out(i)->Opcode() == Op_CastII) {
+ Node* castii = in1->raw_out(i);
+ if (castii->in(0) != NULL && castii->in(0)->in(0) != NULL && castii->in(0)->in(0)->is_If()) {
+ Node* ifnode = castii->in(0)->in(0);
+ if (ifnode->in(1) != NULL && ifnode->in(1)->in(1) == use) {
+ // Reprocess a CastII node that may depend on an
+ // opaque node value when the opaque node is
+ // removed. In case it carries a dependency we can do
+ // a better job of computing its type.
+ _worklist.push(castii);
}
+ }
+ }
+ }
+ }
+ }
// If changed Cast input, check Phi users for simple cycles
if( use->is_ConstraintCast() || use->is_CheckCastPP() ) {
for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
Node* u = use->fast_out(i2);
if (u->is_Phi())