Mercurial > hg > truffle
annotate graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopyCallNode.java @ 19526:8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Fri, 20 Feb 2015 22:22:55 +0100 |
parents | 61d3cb8e1280 |
children | 3d0116ec99c5 |
rev | line source |
---|---|
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
1 /* |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18998
diff
changeset
|
2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
4 * |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
8 * |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
14 * |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
18 * |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
21 * questions. |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
22 */ |
16060
1629244c0df2
ArrayCopyCallNode: add exclude for JaCoCo
Bernhard Urban <bernhard.urban@jku.at>
parents:
16028
diff
changeset
|
23 //JaCoCo Exclude |
18596
5afa718edb8b
arraycopy: move related classes to dedicated package
Bernhard Urban <bernhard.urban@jku.at>
parents:
18592
diff
changeset
|
24 package com.oracle.graal.hotspot.replacements.arraycopy; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
25 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
26 import static com.oracle.graal.api.meta.LocationIdentity.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
27 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
28 import com.oracle.graal.api.meta.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
29 import com.oracle.graal.api.runtime.*; |
15261
882f4cb7cfcf
Move Stamps to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents:
15259
diff
changeset
|
30 import com.oracle.graal.compiler.common.type.*; |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18998
diff
changeset
|
31 import com.oracle.graal.graph.*; |
18518
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
32 import com.oracle.graal.hotspot.*; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
33 import com.oracle.graal.hotspot.meta.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
34 import com.oracle.graal.hotspot.nodes.*; |
16841
cbd42807a31f
moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents:
16837
diff
changeset
|
35 import com.oracle.graal.nodeinfo.*; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
36 import com.oracle.graal.nodes.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
37 import com.oracle.graal.nodes.calc.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
38 import com.oracle.graal.nodes.extended.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
39 import com.oracle.graal.nodes.spi.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
40 import com.oracle.graal.runtime.*; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
41 |
15002
06e50d290784
isAllowedUsageType on Nodes
Lukas Stadler <lukas.stadler@oracle.com>
parents:
14000
diff
changeset
|
42 @NodeInfo(allowedUsageTypes = {InputType.Memory}) |
18998
ec0733b5a90a
Allow final modifier on node subclasses and start adding the modifier to leaf classes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18970
diff
changeset
|
43 public final class ArrayCopyCallNode extends AbstractMemoryCheckpoint implements Lowerable, MemoryCheckpoint.Single { |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
44 |
19526
8fc336a04d77
Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
19403
diff
changeset
|
45 public static final NodeClass<ArrayCopyCallNode> TYPE = NodeClass.create(ArrayCopyCallNode.class); |
16897
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
46 @Input ValueNode src; |
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
47 @Input ValueNode srcPos; |
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
48 @Input ValueNode dest; |
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
49 @Input ValueNode destPos; |
f90dcdbbb75e
switched to using new NodeFieldIterator and NodeFieldIterable for traversing Node inputs and successors
Doug Simon <doug.simon@oracle.com>
parents:
16895
diff
changeset
|
50 @Input ValueNode length; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
51 |
17276
ffb974bef674
moved Node valueNumber and valueEquals logic (optionally) to generated nodes
Doug Simon <doug.simon@oracle.com>
parents:
17130
diff
changeset
|
52 protected Kind elementKind; |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
53 |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
54 /** |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
55 * Aligned means that the offset of the copy is heap word aligned. |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
56 */ |
17276
ffb974bef674
moved Node valueNumber and valueEquals logic (optionally) to generated nodes
Doug Simon <doug.simon@oracle.com>
parents:
17130
diff
changeset
|
57 protected boolean aligned; |
ffb974bef674
moved Node valueNumber and valueEquals logic (optionally) to generated nodes
Doug Simon <doug.simon@oracle.com>
parents:
17130
diff
changeset
|
58 protected boolean disjoint; |
ffb974bef674
moved Node valueNumber and valueEquals logic (optionally) to generated nodes
Doug Simon <doug.simon@oracle.com>
parents:
17130
diff
changeset
|
59 protected boolean uninitialized; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
60 |
18518
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
61 protected final HotSpotGraalRuntimeProvider runtime; |
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
62 |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
63 public ArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, Kind elementKind, |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
64 boolean aligned, boolean disjoint, boolean uninitialized) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
65 this(src, srcPos, dest, destPos, length, elementKind, aligned, disjoint, uninitialized, runtime); |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
66 } |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
67 |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
68 public ArrayCopyCallNode(@InjectedNodeParameter HotSpotGraalRuntimeProvider runtime, ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, Kind elementKind, |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
69 boolean disjoint) { |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
70 this(src, srcPos, dest, destPos, length, elementKind, false, disjoint, false, runtime); |
16895
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16841
diff
changeset
|
71 } |
06c15e88d383
added factory method to all Node classes; replaced Node classes instantiation with calls to factory methods; replaced identity tests on Node classes with ' == <node class>.getGenClass()' idiom
Doug Simon <doug.simon@oracle.com>
parents:
16841
diff
changeset
|
72 |
18518
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
73 protected ArrayCopyCallNode(ValueNode src, ValueNode srcPos, ValueNode dest, ValueNode destPos, ValueNode length, Kind elementKind, boolean aligned, boolean disjoint, boolean uninitialized, |
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
74 HotSpotGraalRuntimeProvider runtime) { |
19396
7e2c87dae93e
Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18998
diff
changeset
|
75 super(TYPE, StampFactory.forVoid()); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
76 assert elementKind != null; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
77 this.src = src; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
78 this.srcPos = srcPos; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
79 this.dest = dest; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
80 this.destPos = destPos; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
81 this.length = length; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
82 this.elementKind = elementKind; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
83 this.aligned = aligned; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
84 this.disjoint = disjoint; |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
85 this.uninitialized = uninitialized; |
18518
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
86 this.runtime = runtime; |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
87 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
88 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
89 public ValueNode getSource() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
90 return src; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
91 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
92 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
93 public ValueNode getSourcePosition() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
94 return srcPos; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
95 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
96 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
97 public ValueNode getDestination() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
98 return dest; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
99 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
100 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
101 public ValueNode getDestinationPosition() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
102 return destPos; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
103 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
104 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
105 public ValueNode getLength() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
106 return length; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
107 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
108 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
109 public Kind getElementKind() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
110 return elementKind; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
111 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
112 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
113 private ValueNode computeBase(ValueNode base, ValueNode pos) { |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
114 FixedWithNextNode basePtr = graph().add(new GetObjectAddressNode(base)); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
115 graph().addBeforeFixed(this, basePtr); |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
116 ValueNode loc = graph().unique(new IndexedLocationNode(getLocationIdentity(), runtime.getArrayBaseOffset(elementKind), pos, runtime.getArrayIndexScale(elementKind))); |
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
117 return graph().unique(new ComputeAddressNode(basePtr, loc, StampFactory.forKind(Kind.Long))); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
118 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
119 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
120 @Override |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
121 public void lower(LoweringTool tool) { |
18970
edf3a7fdd067
Add utility methods to GuardsStage.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
18845
diff
changeset
|
122 if (graph().getGuardsStage().areFrameStatesAtDeopts()) { |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
123 updateAlignedDisjoint(); |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
124 ForeignCallDescriptor desc = HotSpotHostForeignCallsProvider.lookupArraycopyDescriptor(elementKind, isAligned(), isDisjoint(), isUninitialized()); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
125 StructuredGraph graph = graph(); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
126 ValueNode srcAddr = computeBase(getSource(), getSourcePosition()); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
127 ValueNode destAddr = computeBase(getDestination(), getDestinationPosition()); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
128 ValueNode len = getLength(); |
14000
958c99d0790c
Split convert node into separate nodes for different conversions.
Roland Schatz <roland.schatz@oracle.com>
parents:
13977
diff
changeset
|
129 if (len.stamp().getStackKind() != Kind.Long) { |
16248
c5b2a3c22318
refactor more Canonicalizable implementations to not add new nodes to the graph
Lukas Stadler <lukas.stadler@oracle.com>
parents:
16060
diff
changeset
|
130 len = IntegerConvertNode.convert(len, StampFactory.forKind(Kind.Long), graph()); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
131 } |
18845
f57d86eb036f
removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents:
18649
diff
changeset
|
132 ForeignCallNode call = graph.add(new ForeignCallNode(Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend().getForeignCalls(), desc, srcAddr, destAddr, len)); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
133 call.setStateAfter(stateAfter()); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
134 graph.replaceFixedWithFixed(this, call); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
135 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
136 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
137 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
138 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
139 @Override |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
140 public LocationIdentity getLocationIdentity() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
141 if (elementKind != null) { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
142 return NamedLocationIdentity.getArrayLocation(elementKind); |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
143 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
144 return ANY_LOCATION; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
145 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
146 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
147 @NodeIntrinsic |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
148 private static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter Kind elementKind, @ConstantNodeParameter boolean aligned, |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
149 @ConstantNodeParameter boolean disjoint, @ConstantNodeParameter boolean uninitialized); |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
150 |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
151 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter Kind elementKind, boolean aligned, boolean disjoint) { |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
152 arraycopy(src, srcPos, dest, destPos, length, elementKind, aligned, disjoint, false); |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
153 } |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
154 |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
155 public static void disjointArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter Kind elementKind) { |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
156 arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, false); |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
157 } |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
158 |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
159 public static void disjointUninitializedArraycopy(Object src, int srcPos, Object dest, int destPos, int length, @ConstantNodeParameter Kind elementKind) { |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
160 arraycopy(src, srcPos, dest, destPos, length, elementKind, false, true, true); |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
161 } |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
162 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
163 public boolean isAligned() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
164 return aligned; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
165 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
166 |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
167 public boolean isDisjoint() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
168 return disjoint; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
169 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
170 |
16028
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
171 public boolean isUninitialized() { |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
172 return uninitialized; |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
173 } |
bca2ed3b97fd
skip initialization and use arraycopy for cloning arrays
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
15261
diff
changeset
|
174 |
18518
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
175 boolean isHeapWordAligned(JavaConstant value, Kind kind) { |
5366863364e2
removed static access to HotSpotGraalRuntime from ArrayCallCopyNode
Doug Simon <doug.simon@oracle.com>
parents:
18188
diff
changeset
|
176 return (runtime.getArrayBaseOffset(kind) + (long) value.asInt() * runtime.getArrayIndexScale(kind)) % runtime.getConfig().heapWordSize == 0; |
17130
f396d15ddce2
Factor out HotSpot-independent parts of ArrayCopy and ObjectClone nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
16920
diff
changeset
|
177 } |
f396d15ddce2
Factor out HotSpot-independent parts of ArrayCopy and ObjectClone nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
16920
diff
changeset
|
178 |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
179 public void updateAlignedDisjoint() { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
180 Kind componentKind = elementKind; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
181 if (srcPos == destPos) { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
182 // Can treat as disjoint |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
183 disjoint = true; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
184 } |
18188
8652481a1110
Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
185 PrimitiveConstant constantSrc = (PrimitiveConstant) srcPos.stamp().asConstant(); |
8652481a1110
Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents:
18187
diff
changeset
|
186 PrimitiveConstant constantDst = (PrimitiveConstant) destPos.stamp().asConstant(); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
187 if (constantSrc != null && constantDst != null) { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
188 if (!aligned) { |
17130
f396d15ddce2
Factor out HotSpot-independent parts of ArrayCopy and ObjectClone nodes
Christian Wimmer <christian.wimmer@oracle.com>
parents:
16920
diff
changeset
|
189 aligned = isHeapWordAligned(constantSrc, componentKind) && isHeapWordAligned(constantDst, componentKind); |
13977
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
190 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
191 if (constantSrc.asInt() >= constantDst.asInt()) { |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
192 // low to high copy so treat as disjoint |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
193 disjoint = true; |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
194 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
195 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
196 } |
39076a984c33
lower arraycopy calls later and support unchecked object arraycopy
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
diff
changeset
|
197 } |