RFR: 8315771: [JVMCI] Resolution of bootstrap methods with int[] static arguments [v9]
Paul Sandoz
psandoz at openjdk.org
Fri Sep 15 19:46:47 UTC 2023
On Thu, 14 Sep 2023 12:48:13 GMT, Sacha Coppey <duke at openjdk.org> wrote:
>> Currently, `jdk.vm.ci.meta.ConstantPool.lookupBootstrapMethodInvocation` does not support static arguments of type `int[]`.
>>
>> Supporting those static arguments allows to correctly lookup the `BootstrapMethodInvocation` of some `InvokeDynamic` and `DynamicConstant`.
>>
>> To lookup the constant at the index in the static arguments index list, a new class is introduced, allowing to lazily resolve the constant or obtain the constant pool index of the arguments:
>>
>>
>> static class CachedBSMArgs extends AbstractList<JavaConstant> {
>> private final JavaConstant[] cache;
>> private final HotSpotConstantPool cp;
>> private final int bssIndex;
>>
>> CachedBSMArgs(HotSpotConstantPool cp, int bssIndex, int size) {
>> this.cp = cp;
>> this.bssIndex = bssIndex;
>> this.cache = new JavaConstant[size];
>> }
>>
>> @Override
>> public JavaConstant get(int index) {
>> JavaConstant res = cache[index];
>> if (res == null) {
>> int argCpi = compilerToVM().bootstrapArgumentIndexAt(cp, bssIndex, index);
>> res = compilerToVM().lookupConstantInPool(cp, argCpi, false);
>> if (res == null) {
>> res = JavaConstant.forInt(argCpi);
>> }
>> cache[index] = res;
>> }
>> return res;
>> }
>>
>> @Override
>> public int size() {
>> return cache.length;
>> }
>> }
>
> Sacha Coppey has updated the pull request incrementally with one additional commit since the last revision:
>
> Update getStaticArguments documentation example and update TestDynamicConstant to test the new functionality
Some general comments:
- Consider also running `TestDynamicConstant` with the `-XX:UseBootstrapCallInfo=3`. This will stress test the lazy resolution, so it is always lazy. See https://github.com/openjdk/jdk/blob/master/src/hotspot/share/interpreter/bootstrapInfo.cpp#L130 for more details.
- In the default case, lazy resolution of bootstrap args will only occur when a condy refers to another condy, it is not specific to primitive constants. This is to avoid an edge case of infinite recursion in HotSpot (see test https://github.com/openjdk/jdk/blob/master/test/jdk/java/lang/invoke/condy/CondyNestedTest.java)
-------------
PR Comment: https://git.openjdk.org/jdk/pull/15588#issuecomment-1721757452
More information about the hotspot-compiler-dev
mailing list