src/share/vm/opto/c2compiler.cpp
Print this page
*** 42,65 ****
#endif
#ifdef TARGET_ARCH_MODEL_ppc
# include "adfiles/ad_ppc.hpp"
#endif
-
- volatile int C2Compiler::_runtimes = uninitialized;
-
// register information defined by ADLC
extern const char register_save_policy[];
extern const int register_save_type[];
const char* C2Compiler::retry_no_subsuming_loads() {
return "retry without subsuming loads";
}
const char* C2Compiler::retry_no_escape_analysis() {
return "retry without escape analysis";
}
! void C2Compiler::initialize_runtime() {
// Check assumptions used while running ADLC
Compile::adlc_verification();
assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
--- 42,62 ----
#endif
#ifdef TARGET_ARCH_MODEL_ppc
# include "adfiles/ad_ppc.hpp"
#endif
// register information defined by ADLC
extern const char register_save_policy[];
extern const int register_save_type[];
const char* C2Compiler::retry_no_subsuming_loads() {
return "retry without subsuming loads";
}
const char* C2Compiler::retry_no_escape_analysis() {
return "retry without escape analysis";
}
! bool C2Compiler::init_c2_runtime() {
// Check assumptions used while running ADLC
Compile::adlc_verification();
assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
*** 89,132 ****
Compile::pd_compiler2_init();
CompilerThread* thread = CompilerThread::current();
HandleMark handle_mark(thread);
!
! OptoRuntime::generate(thread->env());
!
}
void C2Compiler::initialize() {
-
- // This method can only be called once per C2Compiler object
// The first compiler thread that gets here will initialize the
! // small amount of global state (and runtime stubs) that c2 needs.
// There is a race possible once at startup and then we're fine
// Note that this is being called from a compiler thread not the
// main startup thread.
!
! if (_runtimes != initialized) {
! initialize_runtimes( initialize_runtime, &_runtimes);
}
-
- // Mark this compiler object as ready to roll
- mark_initialized();
}
! void C2Compiler::compile_method(ciEnv* env,
! ciMethod* target,
! int entry_bci) {
! if (!is_initialized()) {
! initialize();
! }
bool subsume_loads = SubsumeLoads;
! bool do_escape_analysis = DoEscapeAnalysis &&
! !env->jvmti_can_access_local_variables();
bool eliminate_boxing = EliminateAutoBox;
while (!env->failing()) {
// Attempt to compile while subsuming loads into machine instructions.
Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing);
--- 86,119 ----
Compile::pd_compiler2_init();
CompilerThread* thread = CompilerThread::current();
HandleMark handle_mark(thread);
! return OptoRuntime::generate(thread->env());
}
void C2Compiler::initialize() {
// The first compiler thread that gets here will initialize the
! // small amount of global state (and runtime stubs) that C2 needs.
// There is a race possible once at startup and then we're fine
// Note that this is being called from a compiler thread not the
// main startup thread.
! if (should_perform_init()) {
! bool successful = C2Compiler::init_c2_runtime();
! int new_state = (successful) ? initialized : failed;
! set_state(new_state);
}
}
! void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
! assert(is_initialized(), "Compiler thread must be initialized");
!
bool subsume_loads = SubsumeLoads;
! bool do_escape_analysis = DoEscapeAnalysis && !env->jvmti_can_access_local_variables();
bool eliminate_boxing = EliminateAutoBox;
while (!env->failing()) {
// Attempt to compile while subsuming loads into machine instructions.
Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing);