mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
6892658: C2 should optimize some stringbuilder patterns
Reviewed-by: kvn, twisti
This commit is contained in:
parent
63cc2211ed
commit
9db2092b1b
35 changed files with 2245 additions and 115 deletions
|
@ -128,6 +128,12 @@ CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index,
|
|||
|
||||
if (allow_inline) {
|
||||
CallGenerator* cg = CallGenerator::for_inline(call_method, expected_uses);
|
||||
if (require_inline && cg != NULL && should_delay_inlining(call_method, jvms)) {
|
||||
// Delay the inlining of this method to give us the
|
||||
// opportunity to perform some high level optimizations
|
||||
// first.
|
||||
return CallGenerator::for_late_inline(call_method, cg);
|
||||
}
|
||||
if (cg == NULL) {
|
||||
// Fall through.
|
||||
} else if (require_inline || !InlineWarmCalls) {
|
||||
|
@ -225,10 +231,63 @@ CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index,
|
|||
} else {
|
||||
// Class Hierarchy Analysis or Type Profile reveals a unique target,
|
||||
// or it is a static or special call.
|
||||
return CallGenerator::for_direct_call(call_method);
|
||||
return CallGenerator::for_direct_call(call_method, should_delay_inlining(call_method, jvms));
|
||||
}
|
||||
}
|
||||
|
||||
// Return true for methods that shouldn't be inlined early so that
|
||||
// they are easier to analyze and optimize as intrinsics.
|
||||
bool Compile::should_delay_inlining(ciMethod* call_method, JVMState* jvms) {
|
||||
if (has_stringbuilder()) {
|
||||
|
||||
if ((call_method->holder() == C->env()->StringBuilder_klass() ||
|
||||
call_method->holder() == C->env()->StringBuffer_klass()) &&
|
||||
(jvms->method()->holder() == C->env()->StringBuilder_klass() ||
|
||||
jvms->method()->holder() == C->env()->StringBuffer_klass())) {
|
||||
// Delay SB calls only when called from non-SB code
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (call_method->intrinsic_id()) {
|
||||
case vmIntrinsics::_StringBuilder_void:
|
||||
case vmIntrinsics::_StringBuilder_int:
|
||||
case vmIntrinsics::_StringBuilder_String:
|
||||
case vmIntrinsics::_StringBuilder_append_char:
|
||||
case vmIntrinsics::_StringBuilder_append_int:
|
||||
case vmIntrinsics::_StringBuilder_append_String:
|
||||
case vmIntrinsics::_StringBuilder_toString:
|
||||
case vmIntrinsics::_StringBuffer_void:
|
||||
case vmIntrinsics::_StringBuffer_int:
|
||||
case vmIntrinsics::_StringBuffer_String:
|
||||
case vmIntrinsics::_StringBuffer_append_char:
|
||||
case vmIntrinsics::_StringBuffer_append_int:
|
||||
case vmIntrinsics::_StringBuffer_append_String:
|
||||
case vmIntrinsics::_StringBuffer_toString:
|
||||
case vmIntrinsics::_Integer_toString:
|
||||
return true;
|
||||
|
||||
case vmIntrinsics::_String_String:
|
||||
{
|
||||
Node* receiver = jvms->map()->in(jvms->argoff() + 1);
|
||||
if (receiver->is_Proj() && receiver->in(0)->is_CallStaticJava()) {
|
||||
CallStaticJavaNode* csj = receiver->in(0)->as_CallStaticJava();
|
||||
ciMethod* m = csj->method();
|
||||
if (m != NULL &&
|
||||
(m->intrinsic_id() == vmIntrinsics::_StringBuffer_toString ||
|
||||
m->intrinsic_id() == vmIntrinsics::_StringBuilder_toString))
|
||||
// Delay String.<init>(new SB())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// uncommon-trap call-sites where callee is unloaded, uninitialized or will not link
|
||||
bool Parse::can_not_compile_call_site(ciMethod *dest_method, ciInstanceKlass* klass) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue