RFR(S): 8243670: Unexpected test result caused by C2 MergeMemNode::Ideal
Tobias Hartmann
tobias.hartmann at oracle.com
Thu May 7 09:10:18 UTC 2020
Hi Felix,
were you able to figure out how we ended up with two Phis with same input but different _adr_type?
Thanks,
Tobias
On 28.04.20 08:02, Yangfei (Felix) wrote:
> Hi,
>
> Please help review this patch fixing a C2 issue.
> Bug: https://bugs.openjdk.java.net/browse/JDK-8243670
> Webrev: http://cr.openjdk.java.net/~fyang/8243670/webrev.00/
>
> As described on the issue, C2 generates incorrect code for the following OSR compile:
> 420 4 % b 4 TestReplaceEquivPhis::test @ 25 (107 bytes)
>
> v = iFld; // load from field "iFld"
> iFld = TestReplaceEquivPhis.instanceCount; // store to field "iFld"
>
> From the C2 JIT code, load and store of field "iFld" are misplaced.
> Looks like this is initially caused by the replace equivalent phis transformation in MergeMemNode::Ideal.
>
> Call trace:
> #0 MergeMemNode::Ideal (this=0x7fff580c70c0, phase=0x7fff7d9407b0, can_reshape=true) at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/memnode.cpp:4621
> #1 0x00007ffff6020bcd in PhaseGVN::apply_ideal (this=0x7fff7d9407b0, k=0x7fff580c70c0, can_reshape=true)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/phaseX.cpp:806
> #2 0x00007ffff60223ef in PhaseIterGVN::transform_old (this=0x7fff7d9407b0, n=0x7fff580c70c0)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/phaseX.cpp:1229
> #3 0x00007ffff602217a in PhaseIterGVN::optimize (this=0x7fff7d9407b0) at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/phaseX.cpp:1175
> #4 0x00007ffff5e32618 in PhaseIdealLoop::build_and_optimize (this=0x7fff7d93fa90, mode=LoopOptsDefault)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/loopnode.cpp:3192
> #5 0x00007ffff5800831 in PhaseIdealLoop::PhaseIdealLoop (this=0x7fff7d93fa90, igvn=..., mode=LoopOptsDefault)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/loopnode.hpp:951
> #6 0x00007ffff580092c in PhaseIdealLoop::optimize (igvn=..., mode=LoopOptsDefault) at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/loopnode.hpp:1026
> #7 0x00007ffff57f4553 in Compile::optimize_loops (this=0x7fff7d942d00, igvn=..., mode=LoopOptsDefault)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/compile.cpp:1970
> #8 0x00007ffff57f5308 in Compile::Optimize (this=0x7fff7d942d00) at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/compile.cpp:2182
> #9 0x00007ffff57ee5a3 in Compile::Compile (this=0x7fff7d942d00, ci_env=0x7fff7d943810, target=0x7fff580eeb70, osr_bci=25, subsume_loads=true,
> do_escape_analysis=true, eliminate_boxing=true, directive=0x7ffff031b430) at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/compile.cpp:736
> #10 0x00007ffff56ebc23 in C2Compiler::compile_method (this=0x7ffff035e940, env=0x7fff7d943810, target=0x7fff580eeb70, entry_bci=25, directive=0x7ffff031b430)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/opto/c2compiler.cpp:111
> #11 0x00007ffff5808cd0 in CompileBroker::invoke_compiler_on_method (task=0x7ffff03b6a10)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/compiler/compileBroker.cpp:2210
> #12 0x00007ffff58079eb in CompileBroker::compiler_thread_loop () at /home/yangfei/openjdk-jdk/src/hotspot/share/compiler/compileBroker.cpp:1894
> #13 0x00007ffff62557f1 in compiler_thread_entry (thread=0x7ffff035f800, __the_thread__=0x7ffff035f800)
> at /home/yangfei/openjdk-jdk/src/hotspot/share/runtime/thread.cpp:3454
> #14 0x00007ffff6250a11 in JavaThread::thread_main_inner (this=0x7ffff035f800) at /home/yangfei/openjdk-jdk/src/hotspot/share/runtime/thread.cpp:1969
> #15 0x00007ffff62508bf in JavaThread::run (this=0x7ffff035f800) at /home/yangfei/openjdk-jdk/src/hotspot/share/runtime/thread.cpp:1952
> #16 0x00007ffff624cb2c in Thread::call_run (this=0x7ffff035f800) at /home/yangfei/openjdk-jdk/src/hotspot/share/runtime/thread.cpp:399
> #17 0x00007ffff5fbf288 in thread_native_entry (thread=0x7ffff035f800) at /home/yangfei/openjdk-jdk/src/hotspot/os/linux/os_linux.cpp:789
> #18 0x00007ffff71976db in start_thread (arg=0x7fff7d944700) at pthread_create.c:463
> #19 0x00007ffff78f188f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
>
> graph before the transformation looks like:
>
> 1: Phi1( Phi1 and Phi2 have the same input edges) #memory Memory: @TestReplaceEquivPhis+12 *, name=iFld, idx=5;
> 2: Phi2( Phi1 and Phi2 have the same input edges) #memory Memory: @BotPTR *+bot, idx=Bot;
> 3: LoadI( input: 1) => name=iFld, idx=5
> 4: MergeMem( input:1, 2)
> 5: MemBarAcqure( input: 4)
> 6: Proj( input: 5)
> 7: StoreI( input: 6) => name=iFld, idx=5
>
> Here Phi1 and Phi2 have same input edges. Input from Phi1 to MergeMem is simplified by MergeMemoryNode::Ideal.
>
> graph after the transformation looks like:
>
> 1: Phi1( Phi1 and Phi2 have the same input edges) #memory Memory: @TestReplaceEquivPhis+12 *, name=iFld, idx=5;
> 2: Phi2( Phi1 and Phi2 have the same input edges) #memory Memory: @BotPTR *+bot, idx=Bot;
> 3: LoadI( input: 1) => name=iFld, idx=5
> 4: MergeMem( input: 2)
> 5: MemBarAcqure( input: 4)
> 6: Proj( input: 5)
> 7: StoreI( input: 6) => name=iFld, idx=5
>
> As a result, PhaseCFG::insert_anti_dependences won't insert an anti-dependence edge between 3 and 4 to place the load correctly.
> This transformation is there from day one. With -XX:-SplitIfBlocks option, it triggers more errors. Proposed webrev simply disables it.
> Tier1-3 tested on x86-64-linux-gnu. Specjbb2015 shows no performance regression with this change.
> Suggestions?
>
> Thanks,
> Felix
>
More information about the hotspot-compiler-dev
mailing list