126 bool allow_inline = (ci != NULL && !ci->is_cold()); |
126 bool allow_inline = (ci != NULL && !ci->is_cold()); |
127 bool require_inline = (allow_inline && ci->is_hot()); |
127 bool require_inline = (allow_inline && ci->is_hot()); |
128 |
128 |
129 if (allow_inline) { |
129 if (allow_inline) { |
130 CallGenerator* cg = CallGenerator::for_inline(call_method, expected_uses); |
130 CallGenerator* cg = CallGenerator::for_inline(call_method, expected_uses); |
|
131 if (require_inline && cg != NULL && should_delay_inlining(call_method, jvms)) { |
|
132 // Delay the inlining of this method to give us the |
|
133 // opportunity to perform some high level optimizations |
|
134 // first. |
|
135 return CallGenerator::for_late_inline(call_method, cg); |
|
136 } |
131 if (cg == NULL) { |
137 if (cg == NULL) { |
132 // Fall through. |
138 // Fall through. |
133 } else if (require_inline || !InlineWarmCalls) { |
139 } else if (require_inline || !InlineWarmCalls) { |
134 return cg; |
140 return cg; |
135 } else { |
141 } else { |
223 if (call_is_virtual) { |
229 if (call_is_virtual) { |
224 return CallGenerator::for_virtual_call(call_method, vtable_index); |
230 return CallGenerator::for_virtual_call(call_method, vtable_index); |
225 } else { |
231 } else { |
226 // Class Hierarchy Analysis or Type Profile reveals a unique target, |
232 // Class Hierarchy Analysis or Type Profile reveals a unique target, |
227 // or it is a static or special call. |
233 // or it is a static or special call. |
228 return CallGenerator::for_direct_call(call_method); |
234 return CallGenerator::for_direct_call(call_method, should_delay_inlining(call_method, jvms)); |
229 } |
235 } |
|
236 } |
|
237 |
|
238 // Return true for methods that shouldn't be inlined early so that |
|
239 // they are easier to analyze and optimize as intrinsics. |
|
240 bool Compile::should_delay_inlining(ciMethod* call_method, JVMState* jvms) { |
|
241 if (has_stringbuilder()) { |
|
242 |
|
243 if ((call_method->holder() == C->env()->StringBuilder_klass() || |
|
244 call_method->holder() == C->env()->StringBuffer_klass()) && |
|
245 (jvms->method()->holder() == C->env()->StringBuilder_klass() || |
|
246 jvms->method()->holder() == C->env()->StringBuffer_klass())) { |
|
247 // Delay SB calls only when called from non-SB code |
|
248 return false; |
|
249 } |
|
250 |
|
251 switch (call_method->intrinsic_id()) { |
|
252 case vmIntrinsics::_StringBuilder_void: |
|
253 case vmIntrinsics::_StringBuilder_int: |
|
254 case vmIntrinsics::_StringBuilder_String: |
|
255 case vmIntrinsics::_StringBuilder_append_char: |
|
256 case vmIntrinsics::_StringBuilder_append_int: |
|
257 case vmIntrinsics::_StringBuilder_append_String: |
|
258 case vmIntrinsics::_StringBuilder_toString: |
|
259 case vmIntrinsics::_StringBuffer_void: |
|
260 case vmIntrinsics::_StringBuffer_int: |
|
261 case vmIntrinsics::_StringBuffer_String: |
|
262 case vmIntrinsics::_StringBuffer_append_char: |
|
263 case vmIntrinsics::_StringBuffer_append_int: |
|
264 case vmIntrinsics::_StringBuffer_append_String: |
|
265 case vmIntrinsics::_StringBuffer_toString: |
|
266 case vmIntrinsics::_Integer_toString: |
|
267 return true; |
|
268 |
|
269 case vmIntrinsics::_String_String: |
|
270 { |
|
271 Node* receiver = jvms->map()->in(jvms->argoff() + 1); |
|
272 if (receiver->is_Proj() && receiver->in(0)->is_CallStaticJava()) { |
|
273 CallStaticJavaNode* csj = receiver->in(0)->as_CallStaticJava(); |
|
274 ciMethod* m = csj->method(); |
|
275 if (m != NULL && |
|
276 (m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString || |
|
277 m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString)) |
|
278 // Delay String.<init>(new SB()) |
|
279 return true; |
|
280 } |
|
281 return false; |
|
282 } |
|
283 |
|
284 default: |
|
285 return false; |
|
286 } |
|
287 } |
|
288 return false; |
230 } |
289 } |
231 |
290 |
232 |
291 |
233 // uncommon-trap call-sites where callee is unloaded, uninitialized or will not link |
292 // uncommon-trap call-sites where callee is unloaded, uninitialized or will not link |
234 bool Parse::can_not_compile_call_site(ciMethod *dest_method, ciInstanceKlass* klass) { |
293 bool Parse::can_not_compile_call_site(ciMethod *dest_method, ciInstanceKlass* klass) { |