[15] RFR(M): 8236493: C2: Inconsistent known instance type information after EA

Tobias Hartmann tobias.hartmann at oracle.com
Fri Jan 17 11:07:37 UTC 2020


Hi,

I found some non-trivial issues with this. I will follow up with a new webrev after fixing.

Thanks,
Tobias

On 14.01.20 15:06, Tobias Hartmann wrote:
> Hi,
> 
> please review the following patch:
> https://bugs.openjdk.java.net/browse/JDK-8236493
> http://cr.openjdk.java.net/~thartmann/8236493/webrev.00/
> 
> While working on 8233164, I've noticed that escape analysis does not set known instance type
> information for LoadNodes and their users if the loaded object does not escape but that information
> is only (incrementally) propagated during IGVN. That's a problem because depending on the sequence
> in which nodes on the worklist are processed, optimizations might still see the not-yet-updated (and
> therefore incorrect) type. For example, another LoadNode optimization might rely on it's memory
> input to be a general memory slice and re-wire it's inputs accordingly (ignoring known instance type
> memory), when it is really reading from a known instance.
> 
> For a detailed description of an instance of such a problem, see my RFR for 8233164 [1]. There, the
> type of a CastPPNode is not updated (yet) and a Load user is incorrectly re-wired.
> 
> To catch this case before things go horribly wrong, I've added an assert to
> Node::raise_bottom_type(). Reverting the fix for 8233164 now immediately triggers the assert because
> the known instance id of a DecodeNNode is only updated during IGVN [2]. All new tests in
> TestInstanceIdPropagation.java trigger the assert as well.
> 
> The fix is to always eagerly propagate that information during EA. If an object loaded from the
> field of a non-escaping object is also non-escaping, we need to propagate that information.
> 
> Thanks,
> Tobias
> 
> [1] https://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2019-December/036616.html
> 
> [2] Failure with TestArrayCopyMemoryChain.java when reverting fix for 8233164:
> 
>  300	Proj	===  288  [[ 301  305  312 ]] #5 !jvms: TestArrayCopyMemoryChain::test2 @ bci:25
>  305	CheckCastPP	===  302  300  [[ 385  316 ]]  #byte[int:1]:NotNull:exact *,iid=288 !jvms:
> TestArrayCopyMemoryChain::test2 @ bci:25
>  385	EncodeP	=== _  305  [[ 387  403 ]]  #narrowoop: byte[int:1]:NotNull:exact *,iid=288 !orig=[402]
> !jvms: TestArrayCopyMemoryChain$Wrapper::<init> @ bci:11 TestArrayCopyMemoryChain::test2 @ bci:41
>  403 >	DecodeN	=== _  385  [[ 494  420 ]]  #byte[int:1]:NotNull:exact *,iid=288 !jvms:
> TestArrayCopyMemoryChain::test2 @ bci:48
>  494	CastPP	===  486  403  [[ 526  514 ]]  #byte[int:>=0]:NotNull:exact * !jvms:
> TestArrayCopyMemoryChain::test2 @ bci:71
>  420	CallStaticJava	===  404  327  341  8  9 ( 419  1  1  1  64  1  1  1  403  257  43  64  11  230
> ) [[ 421 ]] # Static uncommon_trap(reason='intrinsic_or_type_checked_inlining'
> action='make_not_entrant' debug_id='0')  void ( int ) C=0.000100 TestArrayCopyMemoryChain::test2 @
> bci:61 !jvms: TestArrayCopyMemoryChain::test2 @ bci:61
> # To suppress the following error report, specify this argument
> # after -XX: or in .hotspotrc:  SuppressErrorAt=/node.cpp:1088
> #
> # A fatal error has been detected by the Java Runtime Environment:
> #
> #  Internal Error (/oracle/jdk_jdk/open/src/hotspot/share/opto/node.cpp:1088), pid=6482, tid=6496
> #  assert(false) failed: Known instance type should have been set during EA
> 


More information about the hotspot-compiler-dev mailing list