Mercurial > hg > truffle
comparison src/share/vm/opto/doCall.cpp @ 1080:7c57aead6d3e
6892658: C2 should optimize some stringbuilder patterns
Reviewed-by: kvn, twisti
author | never |
---|---|
date | Thu, 12 Nov 2009 09:24:21 -0800 |
parents | bd02caa94611 |
children | e66fd840cb6b |
comparison
equal
deleted
inserted
replaced
1078:8e7adf982378 | 1080:7c57aead6d3e |
---|---|
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) { |