32 extern const char register_save_policy[]; |
32 extern const char register_save_policy[]; |
33 extern const int register_save_type[]; |
33 extern const int register_save_type[]; |
34 |
34 |
35 const char* C2Compiler::retry_no_subsuming_loads() { |
35 const char* C2Compiler::retry_no_subsuming_loads() { |
36 return "retry without subsuming loads"; |
36 return "retry without subsuming loads"; |
|
37 } |
|
38 const char* C2Compiler::retry_no_escape_analysis() { |
|
39 return "retry without escape analysis"; |
37 } |
40 } |
38 void C2Compiler::initialize_runtime() { |
41 void C2Compiler::initialize_runtime() { |
39 |
42 |
40 // Check assumptions used while running ADLC |
43 // Check assumptions used while running ADLC |
41 Compile::adlc_verification(); |
44 Compile::adlc_verification(); |
99 int entry_bci) { |
102 int entry_bci) { |
100 if (!is_initialized()) { |
103 if (!is_initialized()) { |
101 initialize(); |
104 initialize(); |
102 } |
105 } |
103 bool subsume_loads = true; |
106 bool subsume_loads = true; |
|
107 bool do_escape_analysis = DoEscapeAnalysis; |
104 while (!env->failing()) { |
108 while (!env->failing()) { |
105 // Attempt to compile while subsuming loads into machine instructions. |
109 // Attempt to compile while subsuming loads into machine instructions. |
106 Compile C(env, this, target, entry_bci, subsume_loads); |
110 Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis); |
107 |
111 |
108 // Check result and retry if appropriate. |
112 // Check result and retry if appropriate. |
109 if (C.failure_reason() != NULL) { |
113 if (C.failure_reason() != NULL) { |
110 if (C.failure_reason_is(retry_no_subsuming_loads())) { |
114 if (C.failure_reason_is(retry_no_subsuming_loads())) { |
111 assert(subsume_loads, "must make progress"); |
115 assert(subsume_loads, "must make progress"); |
112 subsume_loads = false; |
116 subsume_loads = false; |
|
117 continue; // retry |
|
118 } |
|
119 if (C.failure_reason_is(retry_no_escape_analysis())) { |
|
120 assert(do_escape_analysis, "must make progress"); |
|
121 do_escape_analysis = false; |
113 continue; // retry |
122 continue; // retry |
114 } |
123 } |
115 // Pass any other failure reason up to the ciEnv. |
124 // Pass any other failure reason up to the ciEnv. |
116 // Note that serious, irreversible failures are already logged |
125 // Note that serious, irreversible failures are already logged |
117 // on the ciEnv via env->record_method_not_compilable(). |
126 // on the ciEnv via env->record_method_not_compilable(). |