< prev index next > src/hotspot/share/opto/compile.cpp
Print this page
_igv_idx(0),
_trace_opto_output(directive->TraceOptoOutputOption),
#endif
_has_method_handle_invokes(false),
_clinit_barrier_on_entry(false),
+ _has_clinit_barriers(false),
_stress_seed(0),
_comp_arena(mtCompiler),
_barrier_set_state(BarrierSet::barrier_set()->barrier_set_c2()->create_barrier_state(comp_arena())),
_env(ci_env),
_directive(directive),
_igv_idx(0),
_trace_opto_output(directive->TraceOptoOutputOption),
#endif
_has_method_handle_invokes(false),
_clinit_barrier_on_entry(false),
+ _has_clinit_barriers(false),
_stress_seed(0),
_comp_arena(mtCompiler),
_barrier_set_state(BarrierSet::barrier_set()->barrier_set_c2()->create_barrier_state(comp_arena())),
_env(ci_env),
_directive(directive),
set_use_cmove(UseCMoveUnconditionally /* || do_vector_loop()*/); //TODO: consider do_vector_loop() mandate use_cmove unconditionally
NOT_PRODUCT(if (use_cmove() && Verbose && has_method()) {tty->print("Compile::Init: use CMove without profitability tests for method %s\n", method()->name()->as_quoted_ascii());})
_max_node_limit = _directive->MaxNodeLimitOption;
- if (VM_Version::supports_fast_class_init_checks() && has_method() && !is_osr_compilation() && method()->needs_clinit_barrier()) {
+ if (VM_Version::supports_fast_class_init_checks() && has_method() && !is_osr_compilation() &&
+ (method()->needs_clinit_barrier() || (do_clinit_barriers() && method()->is_static()))) {
set_clinit_barrier_on_entry(true);
+ if (do_clinit_barriers()) {
+ set_has_clinit_barriers(true); // Entry clinit barrier is in prolog code.
+ }
}
if (debug_info()->recording_non_safepoints()) {
set_node_note_array(new(comp_arena()) GrowableArray<Node_Notes*>
(comp_arena(), 8, 0, nullptr));
set_default_node_notes(Node_Notes::make(this));
// Report if there are too many traps at the current method and bci.
// Return true if there was a trap, and/or PerMethodTrapLimit is exceeded.
bool Compile::too_many_traps(ciMethod* method,
int bci,
Deoptimization::DeoptReason reason) {
+ if (method->has_trap_at(bci)) {
+ return true;
+ }
ciMethodData* md = method->method_data();
if (md->is_empty()) {
// Assume the trap has not occurred, or that it occurred only
// because of a transient condition during start-up in the interpreter.
return false;
bool Compile::needs_clinit_barrier(ciField* field, ciMethod* accessing_method) {
return field->is_static() && needs_clinit_barrier(field->holder(), accessing_method);
}
bool Compile::needs_clinit_barrier(ciInstanceKlass* holder, ciMethod* accessing_method) {
- if (holder->is_initialized()) {
+ if (holder->is_initialized() && !do_clinit_barriers()) {
return false;
}
- if (holder->is_being_initialized()) {
+ if (holder->is_being_initialized() || do_clinit_barriers()) {
if (accessing_method->holder() == holder) {
// Access inside a class. The barrier can be elided when access happens in <clinit>,
// <init>, or a static method. In all those cases, there was an initialization
// barrier on the holder klass passed.
if (accessing_method->is_static_initializer() ||
}
}
void Compile::log_late_inline(CallGenerator* cg) {
if (log() != nullptr) {
- log()->head("late_inline method='%d' inline_id='" JLONG_FORMAT "'", log()->identify(cg->method()),
+ log()->head("late_inline method='%d' inline_id='" JLONG_FORMAT "'", log()->identify(cg->method()),
cg->unique_id());
JVMState* p = cg->call_node()->jvms();
while (p != nullptr) {
log()->elem("jvms bci='%d' method='%d'", p->bci(), log()->identify(p->method()));
p = p->caller();
< prev index next >