+1
> On Dec 12, 2017, at 1:21 PM, Hannes Wallnöfer <hannes.wallnoe...@oracle.com>
> wrote:
>
> Thanks for the review, Attila.
>
> I’ve uploaded a new webrev with your suggested changes (including making
> ScriptObject.getProto(int) accept 0 argument and refactoring GET_PROTO code
> in CodeGenerator into a method).
>
> I have also done extensive performance testing over the last days and found
> that for some reason, shared methods for variable access has a very
> detrimental effect on performance for some reason. My theory is that we don’t
> save as much by making property access shared, and the flood of additional
> methods has some significant cost on codegen, runtime, JIT etc. Based on this
> I decided to increase the threshold for shared property access again to 100,
> which performs noticeably better than with the lower threshold in some
> benchmarks.
>
> New webrev is here:
>
> http://cr.openjdk.java.net/~hannesw/8069338/webrev.01/
>
> Hannes
>
>
>> Am 11.12.2017 um 11:55 schrieb Attila Szegedi <szege...@gmail.com>:
>>
>> Reviewing this now, thanks for going ahead and implementing it!
>>
>> So what you are saying about slow scopes is that shared scopes were disabled
>> anyway with them for some time, so you didn’t really take away
>> functionality, just cleaned up the remains?
>>
>> So, some remarks:
>>
>> 1. I see the bytecode shape you wrote around invocation of
>> ScriptObject.getProto(int), and I realized it’s weird it asserts n > 0 and
>> it has the first getProto() unrolled before the loop. I’m pretty sure it can
>> just look like this:
>>
>> public final ScriptObject getProto(final int n) {
>> ScriptObject p = this;
>> for (int i = n; i-- > 0;) {
>> p = p.getProto();
>> }
>> return p;
>> }
>>
>> That assert was there because we knew that it’s only CodeGenerator that
>> emits calls to it, and it will always emit invocations with n > 0, but now
>> we’d have a justification for invoking it with n == 0, so I think it’s fine
>> to do it and avoid the no_proto_call branch in shared scope call bytecode.
>> It’s not a big deal even if you leave it as-is, though.
>>
>> To be entirely pedantic, that assert in getProto should’ve read “n > 1”
>> before because the CodeGenerator was guaranteed to emit invocations to it
>> with n > 1, so a really pedantic implementation of it should’ve read:
>>
>> public final ScriptObject getProto(final int n) {
>> assert n > 1;
>> ScriptObject p = getProto().getProto();
>> for (int i = n - 1; --i > 0;) {
>> p = p.getProto();
>> }
>> return p;
>> }
>>
>> (God, I really hope everyone reading this realizes I’m joking with this last
>> one.)
>>
>> FWIW, we could also factor out the:
>>
>> if (depth > 1) {
>> method.load(depth);
>> method.invoke(ScriptObject.GET_PROTO_DEPTH);
>> } else {
>> method.invoke(ScriptObject.GET_PROTO);
>> }
>>
>> pattern in CodeGenerator into its own little “emitGetProto(int depth)”
>> method, as it appears twice (and make sure it asserts on depth > 0 ;-) )
>>
>> 2. For that invocation of UnwarrantedOptimismException.withProgramPoint -
>> I’d create a Call objects using CompilerConstants.virtualCallNoLookup and
>> stash it in a static final field either in SharedScopeCall or
>> UnwarrantedOptimismException; it’s more typesafe than writing type
>> descriptors as strings.
>>
>> 3. So, UOE.hasPrimitiveReturnValue was unused, I take it?
>>
>> 3. In getStaticSignature you have another occurrence of number 3 that you
>> can replace with FIXED_PARAM_COUNT :-)
>>
>> But these are all minor points… overall, this looks really good.
>>
>> Attila.
>>
>>> On Dec 6, 2017, at 6:43 PM, Hannes Wallnöfer <hannes.wallnoe...@oracle.com>
>>> wrote:
>>>
>>> Please review:
>>>
>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8069338
>>> Webrev: http://cr.openjdk.java.net/~hannesw/8069338/webrev.00/
>>>
>>> This implements shared scope calls for optimistic vars/calls. I followed
>>> Attila’s blueprint in the bug description to the last detail - thanks for
>>> figuring it all out.
>>>
>>> Some adjustments and cleanups I did along the way:
>>>
>>> - Originally shared scope calls were designed to support slow scope vars
>>> (with/eval). However, that feature was disabled later on. I refactored the
>>> code to make it clear that we only do shared scope calls for fast scope
>>> operations.
>>> - I unified the threshold for all shared scope operations to 5. I don’t
>>> think there is a reason for different thresholds for different operations.
>>> I did some testing, using 5 as threshold appeared to be a sensible value.
>>>
>>> Running all of the octane benchmark I see a decrease in created callsites
>>> (200 000 to 178 000) and a slight decrease in callsite invalidations.
>>>
>>> Hannes
>>
>