RFR: 8278518: String(byte[], int, int, Charset) constructor and String.translateEscapes() miss bounds check elimination [v6]
Vladimir Kozlov
kvn at openjdk.java.net
Wed Jan 26 01:02:38 UTC 2022
On Mon, 24 Jan 2022 15:15:55 GMT, Roland Westrelin <roland at openjdk.org> wrote:
>> In the micro benchmark for this bug, the bytecode has a single loop
>> head with 2 backedges. One branch is taken a lot more frequently than
>> the other (for instance, profiling reports 3820938 for the most
>> common, 134068 for the least common). When ciTypeFlow builds its loop
>> tree, the least common loop ends up as the inner loop (ciTypeFlow uses
>> the tail block number to order loops with a shared header). Then
>> ciTypeFlow clones the inner loop head.
>>
>> The results I get then is:
>>
>> StringBenchmark.safeDecoding avgt 5 141.965 ± 53.511 ns/op
>> StringBenchmark.unsafeDecoding avgt 5 123.051 ± 77.855 ns/op
>>
>> The unsafe version uses unsafe instead of standard array accesses. The
>> reason for the unsafe version is to demonstrate that a missed range
>> check elimination in the common path hurts performance (the range
>> check is not performed on the loop iv but another phi so can't be
>> eliminated).
>>
>> The patch I propose takes back branch count (from profile data) into
>> account when building the ciTypeFlow tree. As a consequence, the inner
>> loop (the one for which the loop head is cloned), is the most most
>> frequent one. The range check in the common path is also hoisted in
>> that case (it's now performed on the iv). Running the micro benchmark
>> again, I get:
>>
>> StringBenchmark.safeDecoding avgt 5 53.368 ± 2.232 ns/op
>> StringBenchmark.unsafeDecoding avgt 5 55.565 ± 5.124 ns/op
>>
>> Both are improved (2-3x) and the unsafe version doesn't perform better.
>
> Roland Westrelin has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains ten additional commits since the last revision:
>
> - Merge branch 'master' into JDK-8278518
> - review
> - review
> - whitespaces
> - more review
> - simple benchmark
> - benchmark
> - review
> - fix
I got an other failure in `Kitchecksink`:
# Internal Error (/workspace/open/src/hotspot/share/interpreter/bytecode.cpp:84), pid=5553, tid=18400
# assert(have_fmt == need_fmt) failed: assert_offset_size
#
# JRE version: Java(TM) SE Runtime Environment (19.0) (fastdebug build 19-internal+0-2022-01-25-1858238.vladimir.kozlov.jdkgit)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 19-internal+0-2022-01-25-1858238.vladimir.kozlov.jdkgit, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, serial gc, linux-amd64)
# Problematic frame:
# V [libjvm.so+0x73de5e] Bytecode::assert_offset_size(int, Bytecodes::Code, bool)+0xee
#
Current CompileTask:
C2:1220999 49982 4 die.verwandlung.xmlspec::applyTemplates (2549 bytes)
Stack: [0x00007feb068e9000,0x00007feb069ea000], sp=0x00007feb069e6760, free space=1013k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [libjvm.so+0x73de5e] Bytecode::assert_offset_size(int, Bytecodes::Code, bool)+0xee
V [libjvm.so+0x79d05e] ciBytecodeStream::get_dest() const+0x9e
V [libjvm.so+0x9cc300] ciTypeFlow::profiled_count(ciTypeFlow::Loop*)+0x3c0
V [libjvm.so+0x9ccb50] ciTypeFlow::Loop::sorted_merge(ciTypeFlow::Loop*)+0x250
V [libjvm.so+0x9d036c] ciTypeFlow::build_loop_tree(ciTypeFlow::Block*)+0x1bc
V [libjvm.so+0x9d1f72] ciTypeFlow::df_flow_types(ciTypeFlow::Block*, bool, ciTypeFlow::StateVector*, ciTypeFlow::JsrSet*)+0x632
V [libjvm.so+0x9d24ce] ciTypeFlow::flow_types()+0x41e
V [libjvm.so+0x9d2ff6] ciTypeFlow::do_flow()+0x26
V [libjvm.so+0x965cd4] ciMethod::get_flow_analysis()+0x64
V [libjvm.so+0x7478fe] InlineTree::check_can_parse(ciMethod*)+0xee
V [libjvm.so+0x8b7549] CallGenerator::for_inline(ciMethod*, float)+0x19
V [libjvm.so+0xa99ca4] Compile::Compile(ciEnv*, ciMethod*, int, Options, DirectiveSet*)+0x12e4
-------------
PR: https://git.openjdk.java.net/jdk/pull/7034
More information about the hotspot-compiler-dev
mailing list