[9] RFR(S): 8048879: "unexpected yanked node" opto/postaloc.cpp:139
Tobias Hartmann
tobias.hartmann at oracle.com
Mon Aug 18 10:31:23 UTC 2014
Hi Vladimir,
thanks for the review.
> set_req_X() places dead store on _worklist. Look on
> remove_globally_dead_node() at lines 1246-1248. You can add new check
> into has_special_unique_user() to place membar on worklist.
Right, that's a better solution. I added a new check for a LoadNode
uniquely used by a MemBarAcquireNode.
> You don't need next test's flags:
> -Xbootclasspath/a:. -server
>
> -server should not be specified in jtreg tests.
I removed the flags.
Tested with the failing test and JPRT.
New webrev: http://cr.openjdk.java.net/~thartmann/8048879/webrev.01/
Thanks,
Tobias
>
> Thanks,
> Vladimir
>
> On 8/17/14 11:07 PM, Tobias Hartmann wrote:
>> Hi,
>>
>> please review the following patch that fixes JDK-8048879.
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8048879
>> Webrev: http://cr.openjdk.java.net/~thartmann/8048879/webrev.00/
>>
>> == Problem ==
>> The problem is caused by the following steps:
>> 1) A volatile field access adds a LoadNNode (35) to the graph that is
>> connected to a MemBarAcquireNode (37) to prevent
>> following loads from floating up past. The result of the load is used
>> by a StoreNNode (44) (see [1]).
>> 2) During optimization the StoreNNode (44) is removed because a
>> following StoreNNode (55) writes to the same memory
>> location. The LoadNNode (35) is now useless but still connected to
>> the MemBarAcquireNode (see [2]).
>> 3) During matching a loadConP_load (9) is added together with a
>> MachConstantBaseNode (10) to compute the address for the
>> LoadNNode (see [3]).
>> 4) During register allocation the assert in
>> 'PhaseChaitin::yank_if_dead_recurse' is hit because a dead
>> MachConstantBaseNode is not expected at this point.
>>
>> The unused LoadNNode (35) should have been removed during IGVN.
>> However, the corresponding optimization in
>> 'MemBarNode::Ideal()' (see line 2954 of memnode.cpp) does not apply
>> because at this point the LoadNNode (35) is still
>> connected to the StoreNNode (44). After removing the StoreNNode (44)
>> the MemBarAcquireNode (37) should be added to the
>> IGVN worklist to be processed again.
>>
>> == Solution ==
>> The implementation of 'StoreNode::Ideal' is changed to add the users
>> of the LoadNode to the IGVN worklist if the
>> StoreNode is removed. This allows MemBarNode::Ideal to remove the
>> LoadNode from its precedent input if it is dead (see [4]).
>>
>> I added a jtreg test 'TestMemBarAcquire.java' that triggers the
>> optimization. However, the test does not trigger the
>> original bug because if 'PhaseChaitin::yank_if_dead_recurse' is
>> executed on the MachConstantBaseNode highly depends on
>> the execution of the register allocator. The graphs [1-3] correspond
>> to an execution of the test without the fix. Graph [4]
>>
>> == Testing ==
>> - Failing test (Weblogic + medrec)
>> - JPRT
>>
>> Thanks,
>> Tobias
>>
>> [1]
>> https://bugs.openjdk.java.net/secure/attachment/21801/graph_after_parsing.png
>> [2]
>> https://bugs.openjdk.java.net/secure/attachment/21799/graph_after_IGVN.png
>> [3]
>> https://bugs.openjdk.java.net/secure/attachment/21802/graph_before_reg_alloc.png
>> [4]
>> https://bugs.openjdk.java.net/secure/attachment/21800/graph_after_IGVN_fixed.png
More information about the hotspot-compiler-dev
mailing list