aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/opto/c2compiler.cpp
diff options
context:
space:
mode:
authorkvn <none@none>2008-03-06 10:30:17 -0800
committerkvn <none@none>2008-03-06 10:30:17 -0800
commit7c2a55321683b6d380567c6f4f95e0ad4398477b (patch)
treec7f6c3aa3905066189f55a3798c8d5f850b9f45c /src/share/vm/opto/c2compiler.cpp
parente6d4d4f7eb9c7f99bdc2790daf56795bc47a5041 (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.cpp13
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().