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) {