RFR: 8261731: shallow copy the internal buffer of a scalar-replaced java.lang.String object

Volker Simonis volker.simonis at gmail.com
Thu Mar 4 10:48:42 UTC 2021


Hi Tobias,

thanks a lot for looking at this PR. Did you run your tests with Xin's
latest fix which he has posted yesterday [1]?

Just asking because the last assertion ("unknown code shape") was the
same I've also reported yesterday and he claimed that he fixed that
with his last change [1].

Best regards,
Volker

[1] https://github.com/openjdk/jdk/pull/2570/commits/672bf3c1c650211582dc605bb20ad4c9f0ca5479

On Thu, Mar 4, 2021 at 11:06 AM Tobias Hartmann
<thartmann at openjdk.java.net> wrote:
>
> On Thu, 4 Mar 2021 07:48:03 GMT, Tobias Hartmann <thartmann at openjdk.org> wrote:
>
> >>> Hi Xin,
> >>> when building a fastdebug build of your latest changes I got a crash because of an assertion in your new code.
> >>> I've attached the hs_err and replay file. After restarting the build it succeeded so there must have been a special situation. Hopefully the replay file can help you to reproduce the error.
> >>>
> >>> Best regards,
> >>> Volker
> >>>
> >>> [hs_err_pid18140.log](https://github.com/openjdk/jdk/files/6075724/hs_err_pid18140.log)
> >>> [replay_pid18140.log](https://github.com/openjdk/jdk/files/6075725/replay_pid18140.log)
> >>
> >> hi, Volker,
> >> thank you for using this patch.
> >> Yes, indeed, it's a bug. I introduced yesterday, I got a silly typo for the AddP nodes.  I need to use else if instead of else.
> >> in your replay file, optimization met a special node StrEquals. I have handled it above.
> >> diff --git a/src/hotspot/share/opto/macro.cpp b/src/hotspot/share/opto/macro.cpp
> >> index 56dab5c6449..76e97087fd9 100644
> >> --- a/src/hotspot/share/opto/macro.cpp
> >> +++ b/src/hotspot/share/opto/macro.cpp
> >> @@ -1372,7 +1372,7 @@ void PhaseMacroExpand::process_users_of_string_allocation(AllocateArrayNode* all
> >>              if (n->in(3) == use) { // str2
> >>                _igvn.replace_input_of(n, 3, dst_adr);
> >>              }
> >> -          } if (n->is_AddP()) {
> >> +          } else if (n->is_AddP()) {
> >>              // Skip second AddP. This node must be handled by the upper level.
> >>            } else {
> >>              assert(n->Opcode() == Op_LoadUB || n->Opcode() == Op_LoadB, "unknow code shape");
> >> I will fix soon.
> >
> > I didn't look at the code yet but run this through some quick testing. The following tests fail with `-ea -esa -XX:CompileThreshold=100:`
> > - compiler/codecache/stress/RandomAllocationTest.java
> > - compiler/codecache/stress/UnexpectedDeoptimizationTest.java
> > #  Internal Error (open/src/hotspot/share/opto/node.hpp:825), pid=27269, tid=27288
> > #  assert(is_AllocateArray()) failed: invalid node class: IfTrue
> >
> > Current CompileTask:
> > C2:  12403 2987       4       java.lang.Class::descriptorString (160 bytes)
> >
> > Stack: [0x00007fc080bfc000,0x00007fc080cfd000],  sp=0x00007fc080cf8340,  free space=1008k
> > Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
> > V  [libjvm.so+0x1302c8c]  PhaseMacroExpand::scalar_replacement(AllocateNode*, GrowableArray<SafePointNode*>&)+0x88c
> > V  [libjvm.so+0x1303e5e]  PhaseMacroExpand::eliminate_allocate_node(AllocateNode*) [clone .part.0]+0x50e
> > V  [libjvm.so+0x130447c]  PhaseMacroExpand::eliminate_macro_nodes()+0x57c
> > V  [libjvm.so+0xa0fbb5]  Compile::Optimize()+0x1235
> > V  [libjvm.so+0xa11c85]  Compile::Compile(ciEnv*, ciMethod*, int, bool, bool, bool, bool, DirectiveSet*)+0x1905
> > V  [libjvm.so+0x83d69a]  C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x1ea
> > V  [libjvm.so+0xa21aa1]  CompileBroker::invoke_compiler_on_method(CompileTask*)+0xf21
> > V  [libjvm.so+0xa22748]  CompileBroker::compiler_thread_loop()+0x5a8
> > V  [libjvm.so+0x18488e1]  JavaThread::thread_main_inner()+0x271
> > V  [libjvm.so+0x1850b30]  Thread::call_run()+0x100
> > V  [libjvm.so+0x153b086]  thread_native_entry(Thread*)+0x116
>
> java/lang/String/Split.java and java/lang/management/MemoryMXBean/LowMemoryTest2.sh fail with:
> #  Internal Error (open/src/hotspot/share/opto/macro.cpp:1378), pid=5320, tid=5499
> #  assert(n->Opcode() == Op_LoadUB || n->Opcode() == Op_LoadB) failed: unknow code shape
>
> Current CompileTask:
> C2:  11623  994   !   4       Split::main (651 bytes)
>
> Stack: [0x00007ff1869fe000,0x00007ff186aff000],  sp=0x00007ff186afa2d0,  free space=1008k
> Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
> V  [libjvm.so+0x12f8a5f]  PhaseMacroExpand::process_users_of_string_allocation(AllocateArrayNode*, ArrayCopyNode*)+0x83f
> V  [libjvm.so+0x1303e0e]  PhaseMacroExpand::eliminate_allocate_node(AllocateNode*) [clone .part.0]+0x4be
> V  [libjvm.so+0x130447c]  PhaseMacroExpand::eliminate_macro_nodes()+0x57c
> V  [libjvm.so+0xa0fbb5]  Compile::Optimize()+0x1235
> V  [libjvm.so+0xa11c85]  Compile::Compile(ciEnv*, ciMethod*, int, bool, bool, bool, bool, DirectiveSet*)+0x1905
> V  [libjvm.so+0x83d69a]  C2Compiler::compile_method(ciEnv*, ciMethod*, int, bool, DirectiveSet*)+0x1ea
> V  [libjvm.so+0xa21aa1]  CompileBroker::invoke_compiler_on_method(CompileTask*)+0xf21
> V  [libjvm.so+0xa22748]  CompileBroker::compiler_thread_loop()+0x5a8
> V  [libjvm.so+0x18488e1]  JavaThread::thread_main_inner()+0x271
> V  [libjvm.so+0x1850b30]  Thread::call_run()+0x100
> V  [libjvm.so+0x153b086]  thread_native_entry(Thread*)+0x116
>
>
> And I see some internal testing failing with SIGSEGV in `PhaseMacroExpand::eliminate_allocate_node`
>
> -------------
>
> PR: https://git.openjdk.java.net/jdk/pull/2570


More information about the hotspot-compiler-dev mailing list