From 383c196081be1c5ff37e2e3f90c5b66b4cd3279b Mon Sep 17 00:00:00 2001 From: roland Date: Wed, 27 Jul 2016 12:33:33 +0200 Subject: [PATCH] 8162384: Performance regression: bimorphic inlining may be bypassed by type speculation Summary: when speculation fails at a call fallback to profile data at the call site Reviewed-by: kvn --- src/share/vm/opto/doCall.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/share/vm/opto/doCall.cpp b/src/share/vm/opto/doCall.cpp index f4ed1aed1..fee6eb768 100644 --- a/src/share/vm/opto/doCall.cpp +++ b/src/share/vm/opto/doCall.cpp @@ -205,16 +205,22 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool int morphism = profile.morphism(); if (speculative_receiver_type != NULL) { - // We have a speculative type, we should be able to resolve - // the call. We do that before looking at the profiling at - // this invoke because it may lead to bimorphic inlining which - // a speculative type should help us avoid. - receiver_method = callee->resolve_invoke(jvms->method()->holder(), - speculative_receiver_type); - if (receiver_method == NULL) { - speculative_receiver_type = NULL; + if (!too_many_traps(caller, bci, Deoptimization::Reason_speculate_class_check)) { + // We have a speculative type, we should be able to resolve + // the call. We do that before looking at the profiling at + // this invoke because it may lead to bimorphic inlining which + // a speculative type should help us avoid. + receiver_method = callee->resolve_invoke(jvms->method()->holder(), + speculative_receiver_type); + if (receiver_method == NULL) { + speculative_receiver_type = NULL; + } else { + morphism = 1; + } } else { - morphism = 1; + // speculation failed before. Use profiling at the call + // (could allow bimorphic inlining for instance). + speculative_receiver_type = NULL; } } if (receiver_method == NULL && @@ -252,7 +258,7 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool Deoptimization::Reason_bimorphic : (speculative_receiver_type == NULL ? Deoptimization::Reason_class_check : Deoptimization::Reason_speculate_class_check); if ((morphism == 1 || (morphism == 2 && next_hit_cg != NULL)) && - !too_many_traps(jvms->method(), jvms->bci(), reason) + !too_many_traps(caller, bci, reason) ) { // Generate uncommon trap for class check failure path // in case of monomorphic or bimorphic virtual call site. -- GitLab