< prev index next >

src/hotspot/share/opto/parse1.cpp

Print this page




1721   tmp_jvms->set_should_reexecute(true);
1722   map()->set_jvms(tmp_jvms);
1723   // Execution needs to restart a the next bytecode (entry of next
1724   // block)
1725   if (target->is_merged() ||
1726       pnum > PhiNode::Input ||
1727       target->is_handler() ||
1728       target->is_loop_head()) {
1729     set_parse_bci(target->start());
1730     for (uint j = TypeFunc::Parms; j < map()->req(); j++) {
1731       Node* n = map()->in(j);                 // Incoming change to target state.
1732       const Type* t = NULL;
1733       if (tmp_jvms->is_loc(j)) {
1734         t = target->local_type_at(j - tmp_jvms->locoff());
1735       } else if (tmp_jvms->is_stk(j) && j < (uint)sp() + tmp_jvms->stkoff()) {
1736         t = target->stack_type_at(j - tmp_jvms->stkoff());
1737       }
1738       if (t != NULL && t != Type::BOTTOM) {
1739         if (n->is_ValueType() && !t->isa_valuetype()) {
1740           // Allocate value type in src block to be able to merge it with oop in target block
1741           ValueTypeBaseNode* vt = n->as_ValueType()->allocate(this, true);
1742           map()->set_req(j, ValueTypePtrNode::make_from_value_type(_gvn, vt->as_ValueType()));
1743         }
1744         if (t->isa_valuetype() && !n->is_ValueType()) {
1745           // check for a null constant
1746           assert(n->bottom_type()->remove_speculative() == TypePtr::NULL_PTR, "Anything other than null?");
1747           uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
1748           assert(stopped(), "should be a dead path now");
1749           set_parse_bci(old_bci);
1750           return;
1751         }
1752       }
1753     }
1754   }
1755   map()->set_jvms(old_jvms);
1756   set_parse_bci(old_bci);
1757 
1758   if (!target->is_merged()) {   // No prior mapping at this bci
1759     if (TraceOptoParse) { tty->print(" with empty state");  }
1760 
1761     // If this path is dead, do not bother capturing it as a merge.
1762     // It is "as if" we had 1 fewer predecessors from the beginning.




1721   tmp_jvms->set_should_reexecute(true);
1722   map()->set_jvms(tmp_jvms);
1723   // Execution needs to restart a the next bytecode (entry of next
1724   // block)
1725   if (target->is_merged() ||
1726       pnum > PhiNode::Input ||
1727       target->is_handler() ||
1728       target->is_loop_head()) {
1729     set_parse_bci(target->start());
1730     for (uint j = TypeFunc::Parms; j < map()->req(); j++) {
1731       Node* n = map()->in(j);                 // Incoming change to target state.
1732       const Type* t = NULL;
1733       if (tmp_jvms->is_loc(j)) {
1734         t = target->local_type_at(j - tmp_jvms->locoff());
1735       } else if (tmp_jvms->is_stk(j) && j < (uint)sp() + tmp_jvms->stkoff()) {
1736         t = target->stack_type_at(j - tmp_jvms->stkoff());
1737       }
1738       if (t != NULL && t != Type::BOTTOM) {
1739         if (n->is_ValueType() && !t->isa_valuetype()) {
1740           // Allocate value type in src block to be able to merge it with oop in target block
1741           map()->set_req(j, ValueTypePtrNode::make_from_value_type(this, n->as_ValueType(), true));

1742         }
1743         if (t->isa_valuetype() && !n->is_ValueType()) {
1744           // check for a null constant
1745           assert(n->bottom_type()->remove_speculative() == TypePtr::NULL_PTR, "Anything other than null?");
1746           uncommon_trap(Deoptimization::Reason_null_check, Deoptimization::Action_none);
1747           assert(stopped(), "should be a dead path now");
1748           set_parse_bci(old_bci);
1749           return;
1750         }
1751       }
1752     }
1753   }
1754   map()->set_jvms(old_jvms);
1755   set_parse_bci(old_bci);
1756 
1757   if (!target->is_merged()) {   // No prior mapping at this bci
1758     if (TraceOptoParse) { tty->print(" with empty state");  }
1759 
1760     // If this path is dead, do not bother capturing it as a merge.
1761     // It is "as if" we had 1 fewer predecessors from the beginning.


< prev index next >