// Returns true if m is allowed to be compiled bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) { // allow any levels for WhiteBox assert(WhiteBoxAPI || comp_level == CompLevel_all || is_compile(comp_level), "illegal compilation level"); if (m->is_abstract()) return false; if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false; // Math intrinsics should never be compiled as this can lead to // monotonicity problems because the interpreter will prefer the // compiled code to the intrinsic version. This can't happen in // production because the invocation counter can't be incremented // but we shouldn't expose the system to this problem in testing // modes. if (!AbstractInterpreter::can_be_compiled(m)) { return false; } if (comp_level == CompLevel_all) { if (TieredCompilation) { // enough to be compilable at any level for tiered return !m->is_not_compilable(CompLevel_simple) || !m->is_not_compilable(CompLevel_full_optimization); } else { // must be compilable at available level for non-tiered return !m->is_not_compilable(CompLevel_highest_tier); } } else if (is_compile(comp_level)) { return !m->is_not_compilable(comp_level); } return false; }
AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { // Abstract method? if (m->is_abstract()) return abstract; // Invoker for method handles? if (m->is_method_handle_invoke()) return method_handle; // Native method? // Note: This test must come _before_ the test for intrinsic // methods. See also comments below. if (m->is_native()) { assert(!m->is_method_handle_invoke(), "overlapping bits here, watch out"); return m->is_synchronized() ? native_synchronized : native; } // Synchronized? if (m->is_synchronized()) { return zerolocals_synchronized; } if (RegisterFinalizersAtInit && m->code_size() == 1 && m->intrinsic_id() == vmIntrinsics::_Object_init) { // We need to execute the special return bytecode to check for // finalizer registration so create a normal frame. return zerolocals; } // Empty method? if (m->is_empty_method()) { return empty; } // Special intrinsic method? // Note: This test must come _after_ the test for native methods, // otherwise we will run into problems with JDK 1.2, see also // AbstractInterpreterGenerator::generate_method_entry() for // for details. switch (m->intrinsic_id()) { case vmIntrinsics::_dsin : return java_lang_math_sin ; case vmIntrinsics::_dcos : return java_lang_math_cos ; case vmIntrinsics::_dtan : return java_lang_math_tan ; case vmIntrinsics::_dabs : return java_lang_math_abs ; case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; case vmIntrinsics::_dlog : return java_lang_math_log ; case vmIntrinsics::_dlog10: return java_lang_math_log10; case vmIntrinsics::_Reference_get: return java_lang_ref_reference_get; } // Accessor method? if (m->is_accessor()) { assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1"); return accessor; } // Note: for now: zero locals for all non-empty methods return zerolocals; }
// Create MDO if necessary. void AdvancedThresholdPolicy::create_mdo(methodHandle mh, TRAPS) { if (mh->is_native() || mh->is_abstract() || mh->is_accessor()) return; if (mh->method_data() == NULL) { methodOopDesc::build_interpreter_method_data(mh, THREAD); if (HAS_PENDING_EXCEPTION) { CLEAR_PENDING_EXCEPTION; } } }
// Create MDO if necessary. void AdvancedThresholdPolicy::create_mdo(methodHandle mh, JavaThread* THREAD) { if (mh->is_native() || mh->is_abstract() || mh->is_accessor() || mh->is_constant_getter()) { return; } if (mh->method_data() == NULL) { Method::build_interpreter_method_data(mh, CHECK_AND_CLEAR); } }
// Returns true if m is allowed to be compiled bool CompilationPolicy::can_be_compiled(methodHandle m, int comp_level) { if (m->is_abstract()) return false; if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false; // Math intrinsics should never be compiled as this can lead to // monotonicity problems because the interpreter will prefer the // compiled code to the intrinsic version. This can't happen in // production because the invocation counter can't be incremented // but we shouldn't expose the system to this problem in testing // modes. if (!AbstractInterpreter::can_be_compiled(m)) { return false; } if (comp_level == CompLevel_all) { return !m->is_not_compilable(CompLevel_simple) && !m->is_not_compilable(CompLevel_full_optimization); } else { return !m->is_not_compilable(comp_level); } }
AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) { // Abstract method? if (m->is_abstract()) return abstract; // Method handle primitive? if (m->is_method_handle_intrinsic()) { vmIntrinsics::ID id = m->intrinsic_id(); assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic"); MethodKind kind = (MethodKind)( method_handle_invoke_FIRST + ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) ); assert(kind <= method_handle_invoke_LAST, "parallel enum ranges"); return kind; } #ifndef CC_INTERP if (UseCRC32Intrinsics && m->is_native()) { // Use optimized stub code for CRC32 native methods. switch (m->intrinsic_id()) { case vmIntrinsics::_updateCRC32 : return java_util_zip_CRC32_update; case vmIntrinsics::_updateBytesCRC32 : return java_util_zip_CRC32_updateBytes; case vmIntrinsics::_updateByteBufferCRC32 : return java_util_zip_CRC32_updateByteBuffer; } } #endif // Native method? // Note: This test must come _before_ the test for intrinsic // methods. See also comments below. if (m->is_native()) { assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out"); return m->is_synchronized() ? native_synchronized : native; } // Synchronized? if (m->is_synchronized()) { return zerolocals_synchronized; } if (RegisterFinalizersAtInit && m->code_size() == 1 && m->intrinsic_id() == vmIntrinsics::_Object_init) { // We need to execute the special return bytecode to check for // finalizer registration so create a normal frame. return zerolocals; } // Empty method? if (m->is_empty_method()) { return empty; } // Special intrinsic method? // Note: This test must come _after_ the test for native methods, // otherwise we will run into problems with JDK 1.2, see also // InterpreterGenerator::generate_method_entry() for // for details. switch (m->intrinsic_id()) { case vmIntrinsics::_dsin : return java_lang_math_sin ; case vmIntrinsics::_dcos : return java_lang_math_cos ; case vmIntrinsics::_dtan : return java_lang_math_tan ; case vmIntrinsics::_dabs : return java_lang_math_abs ; case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ; case vmIntrinsics::_dlog : return java_lang_math_log ; case vmIntrinsics::_dlog10: return java_lang_math_log10; case vmIntrinsics::_dpow : return java_lang_math_pow ; case vmIntrinsics::_dexp : return java_lang_math_exp ; case vmIntrinsics::_Reference_get: return java_lang_ref_reference_get; } // Accessor method? if (m->is_accessor()) { assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1"); return accessor; } // Note: for now: zero locals for all non-empty methods return zerolocals; }
// Returns true if m is allowed to be compiled bool CompilationPolicy::canBeCompiled(methodHandle m) { if (m->is_abstract()) return false; if (DontCompileHugeMethods && m->code_size() > HugeMethodLimit) return false; return !m->is_not_compilable(); }
CompilationScope::CompilationScope(methodHandle method, Scope* caller, int callerBCI) : Scope(method, caller, callerBCI) { assert(!method->is_abstract(), "cannot generate code for abstract method"); assert(!method->is_native(), "no scopes for native methods"); }