void Compilation::emit_lir() { CHECK_BAILOUT(); LIRGenerator gen(this, method()); { PhaseTraceTime timeit(_t_lirGeneration); hir()->iterate_linear_scan_order(&gen); } CHECK_BAILOUT(); { PhaseTraceTime timeit(_t_linearScan); LinearScan* allocator = new LinearScan(hir(), &gen, frame_map()); set_allocator(allocator); // Assign physical registers to LIR operands using a linear scan algorithm. allocator->do_linear_scan(); CHECK_BAILOUT(); _max_spills = allocator->max_spills(); } if (BailoutAfterLIR) { if (PrintLIR && !bailed_out()) { print_LIR(hir()->code()); } bailout("Bailing out because of -XX:+BailoutAfterLIR"); } }
void Compilation::bailout(const char* msg) { assert(msg != NULL, "bailout message must exist"); if (!bailed_out()) { // keep first bailout message if (PrintBailouts) tty->print_cr("compilation bailout: %s", msg); _bailout_msg = msg; } }
Compilation::Compilation(AbstractCompiler* compiler, ciEnv* env, ciMethod* method, int osr_bci, BufferBlob* buffer_blob) : _compiler(compiler) , _env(env) , _log(env->log()) , _method(method) , _osr_bci(osr_bci) , _hir(NULL) , _max_spills(-1) , _frame_map(NULL) , _masm(NULL) , _has_exception_handlers(false) , _has_fpu_code(true) // pessimistic assumption , _would_profile(false) , _has_unsafe_access(false) , _has_method_handle_invokes(false) , _bailout_msg(NULL) , _exception_info_list(NULL) , _allocator(NULL) , _next_id(0) , _next_block_id(0) , _code(buffer_blob) , _has_access_indexed(false) , _current_instruction(NULL) #ifndef PRODUCT , _last_instruction_printed(NULL) #endif // PRODUCT { PhaseTraceTime timeit(_t_compile); _arena = Thread::current()->resource_area(); _env->set_compiler_data(this); _exception_info_list = new ExceptionInfoList(); _implicit_exception_table.set_size(0); compile_method(); if (bailed_out()) { _env->record_method_not_compilable(bailout_msg(), !TieredCompilation); if (is_profiling()) { // Compilation failed, create MDO, which would signal the interpreter // to start profiling on its own. _method->ensure_method_data(); } } else if (is_profiling()) { ciMethodData *md = method->method_data_or_null(); if (md != NULL) { md->set_would_profile(_would_profile); } } }