提交 5d526cd3 编写于 作者: M morris

8008811: [parfait] Null pointer deference in hotspot/src/share/vm/opto/loopopts.cpp

Summary: add guarantee() checks
Reviewed-by: kvn
上级 5eeb77af
...@@ -603,7 +603,10 @@ class PhaseIdealLoop : public PhaseTransform { ...@@ -603,7 +603,10 @@ class PhaseIdealLoop : public PhaseTransform {
} }
public: public:
bool has_node( Node* n ) const { return _nodes[n->_idx] != NULL; } bool has_node( Node* n ) const {
guarantee(n != NULL, "No Node.");
return _nodes[n->_idx] != NULL;
}
// check if transform created new nodes that need _ctrl recorded // check if transform created new nodes that need _ctrl recorded
Node *get_late_ctrl( Node *n, Node *early ); Node *get_late_ctrl( Node *n, Node *early );
Node *get_early_ctrl( Node *n ); Node *get_early_ctrl( Node *n );
...@@ -737,7 +740,8 @@ private: ...@@ -737,7 +740,8 @@ private:
return n; return n;
} }
uint dom_depth(Node* d) const { uint dom_depth(Node* d) const {
assert(d->_idx < _idom_size, ""); guarantee(d != NULL, "Null dominator info.");
guarantee(d->_idx < _idom_size, "");
return _dom_depth[d->_idx]; return _dom_depth[d->_idx];
} }
void set_idom(Node* d, Node* n, uint dom_depth); void set_idom(Node* d, Node* n, uint dom_depth);
......
...@@ -232,7 +232,11 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc ...@@ -232,7 +232,11 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
// Loop predicates may have depending checks which should not // Loop predicates may have depending checks which should not
// be skipped. For example, range check predicate has two checks // be skipped. For example, range check predicate has two checks
// for lower and upper bounds. // for lower and upper bounds.
ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp->as_Proj()->_con)->as_Proj(); if (dp == NULL)
return;
ProjNode* dp_proj = dp->as_Proj();
ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp_proj->_con)->as_Proj();
if (exclude_loop_predicate && if (exclude_loop_predicate &&
is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate)) is_uncommon_trap_proj(unc_proj, Deoptimization::Reason_predicate))
return; // Let IGVN transformation change control dependence. return; // Let IGVN transformation change control dependence.
...@@ -866,8 +870,11 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) { ...@@ -866,8 +870,11 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) {
// Now split the bool up thru the phi // Now split the bool up thru the phi
Node *bolphi = split_thru_phi( bol, n_ctrl, -1 ); Node *bolphi = split_thru_phi( bol, n_ctrl, -1 );
guarantee(bolphi != NULL, "null boolean phi node");
_igvn.replace_node( bol, bolphi ); _igvn.replace_node( bol, bolphi );
assert( iff->in(1) == bolphi, "" ); assert( iff->in(1) == bolphi, "" );
if( bolphi->Value(&_igvn)->singleton() ) if( bolphi->Value(&_igvn)->singleton() )
return; return;
...@@ -1628,6 +1635,7 @@ ProjNode* PhaseIdealLoop::proj_clone(ProjNode* p, IfNode* iff) { ...@@ -1628,6 +1635,7 @@ ProjNode* PhaseIdealLoop::proj_clone(ProjNode* p, IfNode* iff) {
//------------------------------ short_circuit_if ------------------------------------- //------------------------------ short_circuit_if -------------------------------------
// Force the iff control output to be the live_proj // Force the iff control output to be the live_proj
Node* PhaseIdealLoop::short_circuit_if(IfNode* iff, ProjNode* live_proj) { Node* PhaseIdealLoop::short_circuit_if(IfNode* iff, ProjNode* live_proj) {
guarantee(live_proj != NULL, "null projection");
int proj_con = live_proj->_con; int proj_con = live_proj->_con;
assert(proj_con == 0 || proj_con == 1, "false or true projection"); assert(proj_con == 0 || proj_con == 1, "false or true projection");
Node *con = _igvn.intcon(proj_con); Node *con = _igvn.intcon(proj_con);
...@@ -1686,6 +1694,7 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes ...@@ -1686,6 +1694,7 @@ ProjNode* PhaseIdealLoop::insert_if_before_proj(Node* left, bool Signed, BoolTes
set_idom(proj, new_if, ddepth); set_idom(proj, new_if, ddepth);
ProjNode* new_exit = proj_clone(other_proj, new_if)->as_Proj(); ProjNode* new_exit = proj_clone(other_proj, new_if)->as_Proj();
guarantee(new_exit != NULL, "null exit node");
register_node(new_exit, get_loop(other_proj), new_if, ddepth); register_node(new_exit, get_loop(other_proj), new_if, ddepth);
return new_exit; return new_exit;
...@@ -1793,7 +1802,10 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo ...@@ -1793,7 +1802,10 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
int stride = stride_of_possible_iv(if_cmpu); int stride = stride_of_possible_iv(if_cmpu);
if (stride == 0) return NULL; 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);
guarantee(lp_proj != NULL, "null loop node");
ProjNode* lp_continue = lp_proj->as_Proj();
ProjNode* lp_exit = if_cmpu->proj_out(!lp_continue->is_IfTrue())->as_Proj(); ProjNode* lp_exit = if_cmpu->proj_out(!lp_continue->is_IfTrue())->as_Proj();
Node* limit = NULL; Node* limit = NULL;
...@@ -1805,6 +1817,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo ...@@ -1805,6 +1817,7 @@ IfNode* PhaseIdealLoop::insert_cmpi_loop_exit(IfNode* if_cmpu, IdealLoopTree *lo
} }
// Create a new region on the exit path // Create a new region on the exit path
RegionNode* reg = insert_region_before_proj(lp_exit); RegionNode* reg = insert_region_before_proj(lp_exit);
guarantee(reg != NULL, "null region node");
// Clone the if-cmpu-true-false using a signed compare // Clone the if-cmpu-true-false using a signed compare
BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge; BoolTest::mask rel_i = stride > 0 ? bol->_test._test : BoolTest::ge;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册