src/share/vm/opto/loopopts.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/opto/loopopts.cpp	Mon Dec 22 15:31:39 2014
--- new/src/share/vm/opto/loopopts.cpp	Mon Dec 22 15:31:38 2014

*** 232,243 **** --- 232,248 ---- // Loop predicates may have depending checks which should not // be skipped. For example, range check predicate has two checks // for lower and upper bounds. ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp->as_Proj()->_con)->as_Proj(); if (exclude_loop_predicate && is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate)) + (is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate) || + is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_range_check))) { + // If this is a range check (IfNode::is_range_check), do not + // reorder because Compile::allow_range_check_smearing might have + // changed the check. return; // Let IGVN transformation change control dependence. + } IdealLoopTree *old_loop = get_loop(dp); for (DUIterator_Fast imax, i = dp->fast_outs(imax); i < imax; i++) { Node* cd = dp->fast_out(i); // Control-dependent node
*** 886,912 **** --- 891,917 ---- // Check for an IF ready to split; one that has its // condition codes input coming from a Phi at the block start. int n_op = n->Opcode(); // Check for an IF being dominated by another IF same test ! if( n_op == Op_If ) { ! if (n_op == Op_If) { Node *bol = n->in(1); uint max = bol->outcnt(); // Check for same test used more than once? ! if( n_op == Op_If && max > 1 && bol->is_Bool() ) { ! if (max > 1 && bol->is_Bool()) { // Search up IDOMs to see if this IF is dominated. Node *cutoff = get_ctrl(bol); // Now search up IDOMs till cutoff, looking for a dominating test Node *prevdom = n; Node *dom = idom(prevdom); ! while( dom != cutoff ) { ! if( dom->req() > 1 && dom->in(1) == bol && prevdom->in(0) == dom ) { ! while (dom != cutoff) { ! if (dom->req() > 1 && dom->in(1) == bol && prevdom->in(0) == dom) { // Replace the dominated test with an obvious true or false. // Place it on the IGVN worklist for later cleanup. C->set_major_progress(); ! dominated_by( prevdom, n, false, true ); #ifndef PRODUCT if( VerifyLoopOptimizations ) verify(); #endif return; }

src/share/vm/opto/loopopts.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File