< prev index next > src/hotspot/share/opto/parse1.cpp
Print this page
#include "opto/parse.hpp"
#include "opto/rootnode.hpp"
#include "opto/runtime.hpp"
#include "opto/type.hpp"
#include "runtime/handles.inline.hpp"
+ #include "runtime/runtimeUpcalls.hpp"
#include "runtime/safepointMechanism.hpp"
#include "runtime/sharedRuntime.hpp"
#include "utilities/bitMap.inline.hpp"
#include "utilities/copy.hpp"
// clear current replaced nodes that are of no use from here on (map was cloned in build_exits).
_caller->map()->delete_replaced_nodes();
// If this is an inlined method, we may have to do a receiver null check.
! if (_caller->has_method() && is_normal_parse() && !method()->is_static()) {
GraphKit kit(_caller);
! kit.null_check_receiver_before_call(method());
_caller = kit.transfer_exceptions_into_jvms();
if (kit.stopped()) {
_exits.add_exception_states_from(_caller);
_exits.set_jvms(_caller);
return nullptr;
// clear current replaced nodes that are of no use from here on (map was cloned in build_exits).
_caller->map()->delete_replaced_nodes();
// If this is an inlined method, we may have to do a receiver null check.
! if (_caller->has_method() && is_normal_parse()) {
GraphKit kit(_caller);
! if (!method()->is_static()) {
+ kit.null_check_receiver_before_call(method());
+ } else if (C->do_clinit_barriers() && C->needs_clinit_barrier(method()->holder(), _caller->method())) {
+ ciMethod* declared_method = kit.method()->get_method_at_bci(kit.bci());
+ const int nargs = declared_method->arg_size();
+ kit.inc_sp(nargs);
+ Node* holder = makecon(TypeKlassPtr::make(method()->holder(), Type::trust_interfaces));
+ kit.guard_klass_is_initialized(holder);
+ kit.dec_sp(nargs);
+ }
_caller = kit.transfer_exceptions_into_jvms();
if (kit.stopped()) {
_exits.add_exception_states_from(_caller);
_exits.set_jvms(_caller);
return nullptr;
if (C->env()->dtrace_method_probes()) {
make_dtrace_method_entry(method());
}
+ install_on_method_entry_runtime_upcalls(method());
+
#ifdef ASSERT
// Narrow receiver type when it is too broad for the method being parsed.
if (!method()->is_static()) {
ciInstanceKlass* callee_holder = method()->holder();
const Type* holder_type = TypeInstPtr::make(TypePtr::BotPTR, callee_holder, Type::trust_interfaces);
set_control( _gvn.transform(result_rgn) );
}
// Add check to deoptimize once holder klass is fully initialized.
void Parse::clinit_deopt() {
+ if (method()->holder()->is_initialized()) {
+ return; // in case do_clinit_barriers() is true
+ }
assert(C->has_method(), "only for normal compilations");
assert(depth() == 1, "only for main compiled method");
assert(is_normal_parse(), "no barrier needed on osr entry");
assert(!method()->holder()->is_not_initialized(), "initialization should have been started");
< prev index next >