85
86 // Note that this is being called from a compiler thread not the
87 // main startup thread.
88 if (should_perform_init()) {
89 bool successful = C2Compiler::init_c2_runtime();
90 int new_state = (successful) ? initialized : failed;
91 set_state(new_state);
92 }
93 }
94
95 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
96 assert(is_initialized(), "Compiler thread must be initialized");
97
98 bool subsume_loads = SubsumeLoads;
99 bool do_escape_analysis = DoEscapeAnalysis && !env->should_retain_local_variables();
100 bool eliminate_boxing = EliminateAutoBox;
101 while (!env->failing()) {
102 // Attempt to compile while subsuming loads into machine instructions.
103 Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing);
104
105
106 // Check result and retry if appropriate.
107 if (C.failure_reason() != NULL) {
108 if (C.failure_reason_is(retry_no_subsuming_loads())) {
109 assert(subsume_loads, "must make progress");
110 subsume_loads = false;
111 continue; // retry
112 }
113 if (C.failure_reason_is(retry_no_escape_analysis())) {
114 assert(do_escape_analysis, "must make progress");
115 do_escape_analysis = false;
116 continue; // retry
117 }
118 if (C.has_boxed_value()) {
119 // Recompile without boxing elimination regardless failure reason.
120 assert(eliminate_boxing, "must make progress");
121 eliminate_boxing = false;
122 continue; // retry
123 }
124 // Pass any other failure reason up to the ciEnv.
125 // Note that serious, irreversible failures are already logged
126 // on the ciEnv via env->record_method_not_compilable().
127 env->record_failure(C.failure_reason());
128 }
129 if (StressRecompilation) {
130 if (subsume_loads) {
131 subsume_loads = false;
132 continue; // retry
133 }
134 if (do_escape_analysis) {
135 do_escape_analysis = false;
136 continue; // retry
137 }
138 }
139
140 // print inlining for last compilation only
141 C.dump_print_inlining();
|
85
86 // Note that this is being called from a compiler thread not the
87 // main startup thread.
88 if (should_perform_init()) {
89 bool successful = C2Compiler::init_c2_runtime();
90 int new_state = (successful) ? initialized : failed;
91 set_state(new_state);
92 }
93 }
94
95 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
96 assert(is_initialized(), "Compiler thread must be initialized");
97
98 bool subsume_loads = SubsumeLoads;
99 bool do_escape_analysis = DoEscapeAnalysis && !env->should_retain_local_variables();
100 bool eliminate_boxing = EliminateAutoBox;
101 while (!env->failing()) {
102 // Attempt to compile while subsuming loads into machine instructions.
103 Compile C(env, this, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing);
104
105 // Check result and retry if appropriate.
106 if (C.failure_reason() != NULL) {
107 if (C.failure_reason_is(retry_no_subsuming_loads())) {
108 assert(subsume_loads, "must make progress");
109 subsume_loads = false;
110 env->report_failure(C.failure_reason());
111 continue; // retry
112 }
113 if (C.failure_reason_is(retry_no_escape_analysis())) {
114 assert(do_escape_analysis, "must make progress");
115 do_escape_analysis = false;
116 env->report_failure(C.failure_reason());
117 continue; // retry
118 }
119 if (C.has_boxed_value()) {
120 // Recompile without boxing elimination regardless failure reason.
121 assert(eliminate_boxing, "must make progress");
122 eliminate_boxing = false;
123 env->report_failure(C.failure_reason());
124 continue; // retry
125 }
126 // Pass any other failure reason up to the ciEnv.
127 // Note that serious, irreversible failures are already logged
128 // on the ciEnv via env->record_method_not_compilable().
129 env->record_failure(C.failure_reason());
130 }
131 if (StressRecompilation) {
132 if (subsume_loads) {
133 subsume_loads = false;
134 continue; // retry
135 }
136 if (do_escape_analysis) {
137 do_escape_analysis = false;
138 continue; // retry
139 }
140 }
141
142 // print inlining for last compilation only
143 C.dump_print_inlining();
|