RFR: 8221542: ~15% performance degradation due to less optimized inline decision
Jie Fu
fujie at loongson.cn
Sat Apr 20 03:35:26 UTC 2019
Ah, I got it.
I like your patch and benefit a lot from you.
Thank you so much, Vladimir.
Any comments from other reviewers?
Thanks.
Best regards,
Jie
On 2019/4/20 上午11:18, Vladimir Ivanov wrote:
>
>>> After some explorations I decided to keep original behavior for
>>> immature profiles (profile.count == -1).
>>
>> I agree.
>>
>> I have two questions here.
>>
>> 1. What's the difference of the following two if statements?
>> -------------------------------------------------
>> + if (!callee_method->was_executed_more_than(0)) return true; //
>> callee was never executed
>> +
>> + if (caller_method->is_not_reached(caller_bci)) return true; //
>> call site not resolved
>> -------------------------------------------------
>> I think only one of them is needed.
>
> The checks are complimentary: one inspects callee and the other looks
> at call site.
>
> "!callee_method->was_executed_more_than(0)" ensures that callee was
> executed at least once.
>
> "caller_method->is_not_reached(caller_bci)" inspects the state of the
> call site. If corresponding CP entry is not resolved, then the call
> site isn't reached. If is_not_reached() returns false, it's not a
> definitive answer: there's still a chance the site is not reached -
> consider the case of virtual calls where callee_method may differ for
> the same resolved method.
>
>> 2. Does the assert in InlineTree::is_not_reached(...) make sense?
>> Since we have
>> -------------------------------------------------
>> if (profile.count() > 0) return false; // reachable according to
>> profile
>> -------------------------------------------------
>> and
>> -------------------------------------------------
>> if (profile.count() == -1) {...}
>> -------------------------------------------------
>> before
>> -------------------------------------------------
>> assert(profile.count() == 0, "sanity");
>> -------------------------------------------------
>> is the assert redundant?
>
> Asserts are intended to be redundant :-) But still catch bugs from
> time to time.
>
> This one, in particular, checks invariant on profile.count() >= -1
> (which is not very useful by itself), but also stresses that
> "profile.count() == 0" case is being processed.
>
> Best regards,
> Vladimir Ivanov
More information about the hotspot-compiler-dev
mailing list