[9] RFR(S) 8065618: C2 RA incorrectly removes kill projections

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Dec 2 02:41:42 UTC 2014


Good suggestion, Rickard.

I filed RFE:

https://bugs.openjdk.java.net/browse/JDK-8066312

Thanks,
Vladimir

On 11/24/14 12:28 AM, Rickard Bäckman wrote:
> Vladimir,
>
> I think it would be great if the for loop that looks for the SCMemProj
> could be moved out to be a function on it's own and just have
> if (n->is_MachProj() && n->has_SCMemProj()) {
>    return false;
> }
>
> has_SCMemProj() could be replaced by something else.
>
> Otherwise it looks good.
>
> /R
>
> On 11/21, Vladimir Kozlov wrote:
>> http://cr.openjdk.java.net/~kvn/8065618/webrev/
>> https://bugs.openjdk.java.net/browse/JDK-8065618
>>
>> Some nodes have SCMemProj projection node to keep them alive even
>> when their result is not used because they have memory side effects.
>> For example, EncodeISOArrayNode and loadstore nodes like
>> CompareAndSwapPNode. Generated code for such nodes may kill some
>> registers and flags during execution. Killed registers are declared
>> in 'effect' list in mach nodes definitions in .ad files. For each
>> killed register MachProj node is created without use:
>>
>>   112    encode_iso_array        ===  103  125  113  114  108  119
>> 120  121  122  [[ 116  117  118  123  124  127  131  134  102  156
>> ]] !jvms: ISO_8859_1$Encoder::encode @ bci:32 Test6896617::test @
>> bci:26
>>   116    MachProj        ===  112  [[]] #1
>>   117    MachProj        ===  112  [[]] #2
>>   118    MachProj        ===  112  [[]] #3
>>   127    SCMemProj       ===  112  [[ 126  136  138  139  140  150
>> 160 ]]   Memory: @BotPTR *+bot, idx=Bot; !jvms:
>> ISO_8859_1$Encoder::encode @ bci:32 Test6896617::test @ bci:26
>>   123    MachProj        ===  112  [[]] #4
>>   124    MachProj        ===  112  [[]] #5
>>
>> Register Allocator in PhaseChaitin::build_ifg_physical() removes
>> nodes which are not used (dead). Nodes with
>>
>> To keep such nodes alive when their result is not used there method
>> PhaseChaitin::add_input_to_liveout() puts node's LiveRange on
>> liveout list when the node has SCMemProj projection.
>>
>> Unfortunately SCMemProj node could be placed in a block in such
>> order that kill MachProj nodes are processed first (as in example
>> above). When those MachProj are processed the def node looks like
>> dead and these nodes are removed from graph. As result killed
>> register is not marked as killed anymore and it could be used after
>> code which kills/modifies it.
>>
>> I was not able to write test with existing VM code. encodeISOArray()
>> method can't be called directly - it is part of
>> sun.nio.cs.ISO_8859_1$Encoder::encode() which calls it in a loop.
>> There is enough code after encodeISOArray() call in encode() method
>> which prevents using the same register after encode(). I have
>> experimental project with intrinsics which hits this problem and I
>> verified the fix with it.
>>
>> Thanks,
>> Vladimir
>>
>>
>>
>>


More information about the hotspot-compiler-dev mailing list