diff options
author | kvn <none@none> | 2008-03-06 10:30:17 -0800 |
---|---|---|
committer | kvn <none@none> | 2008-03-06 10:30:17 -0800 |
commit | 7c2a55321683b6d380567c6f4f95e0ad4398477b (patch) | |
tree | c7f6c3aa3905066189f55a3798c8d5f850b9f45c /src/share/vm/opto/c2compiler.cpp | |
parent | e6d4d4f7eb9c7f99bdc2790daf56795bc47a5041 (diff) |
6667610: (Escape Analysis) retry compilation without EA if it fails
Summary: During split unique types EA could exceed nodes limit and fail the method compilation.
Reviewed-by: rasbold
Diffstat (limited to 'src/share/vm/opto/c2compiler.cpp')
-rw-r--r-- | src/share/vm/opto/c2compiler.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/share/vm/opto/c2compiler.cpp b/src/share/vm/opto/c2compiler.cpp index 6543e692b..591b7ea05 100644 --- a/src/share/vm/opto/c2compiler.cpp +++ b/src/share/vm/opto/c2compiler.cpp @@ -35,6 +35,9 @@ 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 @@ -101,17 +104,23 @@ void C2Compiler::compile_method(ciEnv* env, initialize(); } bool subsume_loads = true; + bool do_escape_analysis = DoEscapeAnalysis; while (!env->failing()) { // Attempt to compile while subsuming loads into machine instructions. - Compile C(env, this, target, entry_bci, subsume_loads); + Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis); // Check result and retry if appropriate. if (C.failure_reason() != NULL) { - if (C.failure_reason_is(retry_no_subsuming_loads())) { + if (C.failure_reason_is(retry_no_subsuming_loads())) { assert(subsume_loads, "must make progress"); subsume_loads = false; continue; // retry } + if (C.failure_reason_is(retry_no_escape_analysis())) { + assert(do_escape_analysis, "must make progress"); + do_escape_analysis = false; + continue; // retry + } // Pass any other failure reason up to the ciEnv. // Note that serious, irreversible failures are already logged // on the ciEnv via env->record_method_not_compilable(). |