[9] RFR(S) 8065618: C2 RA incorrectly removes kill projections
Rickard Bäckman
rickard.backman at oracle.com
Mon Nov 24 08:28:29 UTC 2014
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
>
>
>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20141124/7a840889/signature.asc>
More information about the hotspot-compiler-dev
mailing list