bool CountedLoopReserveKit::create_reserve() { if (!_active) { return false; } if(!_lpt->_head->is_CountedLoop()) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not counted loop", _lpt->_head->_idx); } return false; } CountedLoopNode *cl = _lpt->_head->as_CountedLoop(); if (!cl->is_valid_counted_loop()) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not valid counted loop", cl->_idx); } return false; // skip malformed counted loop } if (!cl->is_main_loop()) { bool loop_not_canonical = true; if (cl->is_post_loop() && (cl->slp_max_unroll() > 0)) { loop_not_canonical = false; } // only reject some loop forms if (loop_not_canonical) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not canonical loop", cl->_idx); } return false; // skip normal, pre, and post (conditionally) loops } } _lp = _lpt->_head->as_Loop(); _lp_reserved = _phase->create_reserve_version_of_loop(_lpt, this); if (!_lp_reserved->is_CountedLoop()) { return false; } Node* ifslow_pred = _lp_reserved->as_CountedLoop()->in(LoopNode::EntryControl); if (!ifslow_pred->is_IfFalse()) { return false; } Node* iff = ifslow_pred->in(0); if (!iff->is_If() || iff != _iff) { return false; } if (iff->in(1)->Opcode() != Op_ConI) { return false; } return _has_reserved = true; }
bool CountedLoopReserveKit::create_reserve() { if (!_active) { return false; } if(!_lpt->_head->is_CountedLoop()) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not counted loop", _lpt->_head->_idx); } return false; } CountedLoopNode *cl = _lpt->_head->as_CountedLoop(); if (!cl->is_valid_counted_loop()) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not valid counted loop", cl->_idx); } return false; // skip malformed counted loop } if (!cl->is_main_loop()) { if (TraceLoopOpts) { tty->print_cr("CountedLoopReserveKit::create_reserve: %d not main loop", cl->_idx); } return false; // skip normal, pre, and post loops } _lp = _lpt->_head->as_Loop(); _lp_reserved = _phase->create_reserve_version_of_loop(_lpt, this); if (!_lp_reserved->is_CountedLoop()) { return false; } Node* ifslow_pred = _lp_reserved->as_CountedLoop()->in(LoopNode::EntryControl); if (!ifslow_pred->is_IfFalse()) { return false; } Node* iff = ifslow_pred->in(0); if (!iff->is_If() || iff != _iff) { return false; } if (iff->in(1)->Opcode() != Op_ConI) { return false; } return _has_reserved = true; }