public abstract class ArrayCopySnippets extends Object implements Snippets
System.arraycopy(java.lang.Object, int, java.lang.Object, int, int).
ArrayCopySnippets.arraycopyNativeExceptionSnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters): this snippet is used when the array copy is known
to throw an exception, either because at least one of the objects is not an array, or one is an
object array and the other one a primitive array.ArrayCopySnippets.arraycopyExactStubCallSnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.ArrayCopyTypeCheck, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.SnippetCounter, org.graalvm.compiler.replacements.SnippetCounter, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters): this snippet is used for array copies that do not
require a store check. This is the case if the array copy is either
exact, i.e., we can prove that the source array type is
assignable to the destination array type, or if one of the objects is a primitive array (and the
other is unknown). In the latter case, it is sufficient to dynamically check that the array types
are the same. No store check is needed.ArrayCopySnippets.exactArraycopyWithExpandedLoopSnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters): if we can do an
array copy without store check, it might be better to
inline the copy loop to allow further compiler phases to optimize the code, instead of doing a
stub call. This is only done if mayExpandThisArraycopy is true. Lowering is
delayed until deopts are fixed using
ArrayCopySnippets.delayedExactArraycopyWithExpandedLoopSnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.ArrayCopyTypeCheck, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.SnippetCounter, org.graalvm.compiler.replacements.SnippetCounter, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters).ArrayCopySnippets.checkcastArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters): this snippet is used if at least one of the objects is an
object array, but the compatibility of source and destination cannot be proven statically. We
need to perform a store check on every element. Lowering is delayed after framestate assignment via ArrayCopySnippets.delayedCheckcastArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.ArrayCopyTypeCheck, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters, JavaKind))ArrayCopySnippets.genericArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters): this snippet is used if we have no information about the
types of the objects. The snippet needs to perform all required type and store checks. Lowering
is delayed after framestate assignment via
ArrayCopySnippets.delayedGenericArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.ArrayCopyTypeCheck, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters, JavaKind).ArrayCopySnippets.Templates.lower(ArrayCopyNode, boolean, LoweringTool) for the implementation details
of the lowering strategies.| Modifier and Type | Class and Description |
|---|---|
protected static class |
ArrayCopySnippets.ArrayCopyTypeCheck |
protected static class |
ArrayCopySnippets.Counters |
static class |
ArrayCopySnippets.Templates |
static class |
ArrayCopySnippets.WorkSnippetID
Identifies snippets used for delayed lowering
of
ArrayCopyNode. |
| Modifier and Type | Field and Description |
|---|---|
protected static MetaAccessProvider |
INJECTED_META_ACCESS
Marker value for the
Fold.InjectedParameter injected parameter. |
| Constructor and Description |
|---|
ArrayCopySnippets() |
| Modifier and Type | Method and Description |
|---|---|
void |
arraycopyExactStubCallSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck,
JavaKind elementKind,
org.graalvm.word.LocationIdentity locationIdentity,
SnippetCounter elementKindCounter,
SnippetCounter elementKindCopiedCounter,
ArrayCopySnippets.Counters counters)
Snippet that performs a stub call for an exact
array copy.
|
static void |
arraycopyNativeExceptionSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
ArrayCopySnippets.Counters counters)
Performs an array copy using the original
System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) call. |
protected void |
checkArrayTypes(Object nonNullSrc,
Object nonNullDest,
ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck) |
void |
checkcastArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation,
ArrayCopySnippets.Counters counters)
Performs an array copy via fast checkcast stub.
|
protected int[] |
checkLimits(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
ArrayCopySnippets.Counters counters)
Checks the limits of
srcPost, destPos, and length and return those
values with better stamps. |
protected static int[] |
createCheckLimitsResult(int srcPos,
int destPos,
int length)
|
void |
delayedCheckcastArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck,
ArrayCopySnippets.Counters counters,
JavaKind elementKind)
Performs an array copy with a type check for every store.
|
void |
delayedExactArraycopyWithExpandedLoopSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck,
JavaKind elementKind,
org.graalvm.word.LocationIdentity locationIdentity,
SnippetCounter elementKindCounter,
SnippetCounter elementKindCopiedCounter,
ArrayCopySnippets.Counters counters)
Snippet that performs an exact array copy.
|
void |
delayedGenericArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck,
ArrayCopySnippets.Counters counters,
JavaKind elementKind)
Performs an array copy using a generic stub.
|
protected void |
doArraycopyExactStubCallSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity locationIdentity,
ArrayCopySnippets.Counters counters) |
protected abstract void |
doCheckcastArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation,
ArrayCopySnippets.Counters counters) |
protected void |
doExactArraycopyWithExpandedLoopSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation) |
protected abstract void |
doGenericArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation,
ArrayCopySnippets.Counters counters) |
void |
exactArraycopyWithExpandedLoopSnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation,
ArrayCopySnippets.Counters counters)
Inlines a loop that performs an exact
element-by-element array copy.
|
void |
genericArraycopySnippet(Object src,
int srcPos,
Object dest,
int destPos,
int length,
JavaKind elementKind,
org.graalvm.word.LocationIdentity arrayLocation,
ArrayCopySnippets.Counters counters)
Performs a generic array copy with all required type and store checks.
|
protected abstract int |
heapWordSize() |
abstract boolean |
hubsEqual(Object nonNullSrc,
Object nonNullDest)
Checks whether the hubs for the given objects are equal.
|
abstract boolean |
layoutHelpersEqual(Object nonNullSrc,
Object nonNullDest)
Checks whether the layout helpers for the given objects are equal.
|
static void |
registerSystemArraycopyPlugin(InvocationPlugins.Registration r) |
static void |
registerSystemArraycopyPlugin(InvocationPlugins.Registration r,
boolean forceAnyLocation) |
protected boolean |
useOriginalArraycopy()
Returns
true if the original System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) method can be called to
implement exceptional or fallback paths. |
protected static final MetaAccessProvider INJECTED_META_ACCESS
Fold.InjectedParameter injected parameter.public static void registerSystemArraycopyPlugin(InvocationPlugins.Registration r)
public static void registerSystemArraycopyPlugin(InvocationPlugins.Registration r, boolean forceAnyLocation)
public abstract boolean hubsEqual(Object nonNullSrc, Object nonNullDest)
public abstract boolean layoutHelpersEqual(Object nonNullSrc, Object nonNullDest)
protected abstract int heapWordSize()
protected boolean useOriginalArraycopy()
true if the original System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) method can be called to
implement exceptional or fallback paths.public void delayedExactArraycopyWithExpandedLoopSnippet(Object src, int srcPos, Object dest, int destPos, int length, ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck, JavaKind elementKind, org.graalvm.word.LocationIdentity locationIdentity, SnippetCounter elementKindCounter, SnippetCounter elementKindCopiedCounter, ArrayCopySnippets.Counters counters)
ArrayCopyWithDelayedLoweringNode which will dispatch to
ArrayCopySnippets.exactArraycopyWithExpandedLoopSnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters).ArrayCopySnippets.Templates.lower(ArrayCopyNode, boolean, LoweringTool),
ArrayCopySnippets.exactArraycopyWithExpandedLoopSnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters),
ArrayCopySnippets.doExactArraycopyWithExpandedLoopSnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity)public void arraycopyExactStubCallSnippet(Object src, int srcPos, Object dest, int destPos, int length, ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck, JavaKind elementKind, org.graalvm.word.LocationIdentity locationIdentity, SnippetCounter elementKindCounter, SnippetCounter elementKindCopiedCounter, ArrayCopySnippets.Counters counters)
protected void doArraycopyExactStubCallSnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity locationIdentity, ArrayCopySnippets.Counters counters)
public void delayedCheckcastArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck, ArrayCopySnippets.Counters counters, JavaKind elementKind)
ArrayCopyWithDelayedLoweringNode which will dispatch to
ArrayCopySnippets.checkcastArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters).public void delayedGenericArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck, ArrayCopySnippets.Counters counters, JavaKind elementKind)
ArrayCopyWithDelayedLoweringNode which
will dispatch to ArrayCopySnippets.genericArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters).public static void arraycopyNativeExceptionSnippet(Object src, int srcPos, Object dest, int destPos, int length, ArrayCopySnippets.Counters counters)
System.arraycopy(java.lang.Object, int, java.lang.Object, int, int) call. Currently, this is
only used in cases where we already know that the operation will throw an exception.public void exactArraycopyWithExpandedLoopSnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation, ArrayCopySnippets.Counters counters)
protected void doExactArraycopyWithExpandedLoopSnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation)
public void checkcastArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation, ArrayCopySnippets.Counters counters)
protected abstract void doCheckcastArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation, ArrayCopySnippets.Counters counters)
public void genericArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation, ArrayCopySnippets.Counters counters)
ArrayCopySnippets.delayedGenericArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.ArrayCopyTypeCheck, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters, JavaKind),
ArrayCopySnippets.doGenericArraycopySnippet(java.lang.Object, int, java.lang.Object, int, int, JavaKind, org.graalvm.word.LocationIdentity, org.graalvm.compiler.replacements.arraycopy.ArrayCopySnippets.Counters)protected abstract void doGenericArraycopySnippet(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, org.graalvm.word.LocationIdentity arrayLocation, ArrayCopySnippets.Counters counters)
protected static int[] createCheckLimitsResult(int srcPos,
int destPos,
int length)
protected int[] checkLimits(Object src, int srcPos, Object dest, int destPos, int length, JavaKind elementKind, ArrayCopySnippets.Counters counters)
srcPost, destPos, and length and return those
values with better stamps.
Writing this as individual if statements to avoid a merge without a frame state.srcPos (at offset ArrayCopySnippets.SRC_IDX),
destPos (at offset ArrayCopySnippets.DEST_IDX), and length parameters (at
offset ArrayCopySnippets.LENGTH_IDX), but annotated with PiNode.piCastPositive(int, org.graalvm.compiler.nodes.extended.GuardingNode). This
an array rather than a dedicated class with proper members to avoid storing
information about the class in encoded snippets.ArrayCopySnippets.createCheckLimitsResult(int, int, int)protected void checkArrayTypes(Object nonNullSrc, Object nonNullDest, ArrayCopySnippets.ArrayCopyTypeCheck arrayTypeCheck)