--- old/src/share/vm/opto/loopopts.cpp 2013-03-05 17:21:14.000000000 -0500 +++ new/src/share/vm/opto/loopopts.cpp 2013-03-05 17:21:14.000000000 -0500 @@ -232,7 +232,11 @@ // 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(); + ProjNode* dp_proj = dp->as_Proj(); + if (dp_proj == NULL) + return; + + ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp_proj->_con)->as_Proj(); if (exclude_loop_predicate && is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate)) return; // Let IGVN transformation change control dependence. @@ -868,6 +872,10 @@ Node *bolphi = split_thru_phi( bol, n_ctrl, -1 ); _igvn.replace_node( bol, bolphi ); assert( iff->in(1) == bolphi, "" ); + assert( bolphi != NULL, "null boolean phi node"); + + if( !bolphi ) return; + if( bolphi->Value(&_igvn)->singleton() ) return; @@ -1628,6 +1636,11 @@ //------------------------------ short_circuit_if ------------------------------------- // Force the iff control output to be the live_proj Node* PhaseIdealLoop::short_circuit_if(IfNode* iff, ProjNode* live_proj) { + assert(live_proj != NULL, "null projection"); + if (live_proj == NULL) { + ShouldNotReachHere(); + return NULL; + } int proj_con = live_proj->_con; assert(proj_con == 0 || proj_con == 1, "false or true projection"); Node *con = _igvn.intcon(proj_con); @@ -1686,6 +1699,11 @@ set_idom(proj, new_if, ddepth); ProjNode* new_exit = proj_clone(other_proj, new_if)->as_Proj(); + assert(new_exit != NULL, "null exit node"); + if (new_exit == NULL) { + ShouldNotReachHere(); + return NULL; + } register_node(new_exit, get_loop(other_proj), new_if, ddepth); return new_exit; @@ -1793,7 +1811,10 @@ int stride = stride_of_possible_iv(if_cmpu); if (stride == 0) return NULL; - ProjNode* lp_continue = stay_in_loop(if_cmpu, loop)->as_Proj(); + Node* lp_proj = stay_in_loop(if_cmpu, loop); + if (lp_proj == NULL) return NULL; + + ProjNode* lp_continue = lp_proj->as_Proj(); ProjNode* lp_exit = if_cmpu->proj_out(!lp_continue->is_IfTrue())->as_Proj(); Node* limit = NULL; @@ -1805,6 +1826,7 @@ } // Create a new region on the exit path RegionNode* reg = insert_region_before_proj(lp_exit); + if (reg == NULL) return NULL; // Clone the if-cmpu-true-false using a signed compare BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge;