/**
  * This intrinsic is useful for the case where we know something statically about one of the
  * inputs but not the other.
  */
 @Snippet
 public static void arraycopyPredictedExactIntrinsic(
     Object src,
     int srcPos,
     Object dest,
     int destPos,
     int length,
     @ConstantParameter JavaKind elementKind,
     @ConstantParameter SnippetCounter counter,
     @ConstantParameter SnippetCounter copiedCounter) {
   Object nonNullSrc = GraalDirectives.guardingNonNull(src);
   Object nonNullDest = GraalDirectives.guardingNonNull(dest);
   KlassPointer srcHub = loadHub(nonNullSrc);
   KlassPointer destHub = loadHub(nonNullDest);
   if (probability(SLOW_PATH_PROBABILITY, srcHub != destHub)) {
     DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint);
   }
   checkLimits(nonNullSrc, srcPos, nonNullDest, destPos, length);
   counter.inc();
   copiedCounter.add(length);
   ArrayCopyCallNode.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length, elementKind);
   if (length == 0) {
     zeroLengthDynamicCounter.inc();
   } else {
     nonZeroLengthDynamicCounter.inc();
     nonZeroLengthDynamicCopiedCounter.add(length);
   }
 }
 @Snippet
 public static void arraycopyExactIntrinsic(
     Object src,
     int srcPos,
     Object dest,
     int destPos,
     int length,
     @ConstantParameter JavaKind elementKind,
     @ConstantParameter SnippetCounter counter,
     @ConstantParameter SnippetCounter copiedCounter) {
   Object nonNullSrc = GraalDirectives.guardingNonNull(src);
   Object nonNullDest = GraalDirectives.guardingNonNull(dest);
   checkLimits(nonNullSrc, srcPos, nonNullDest, destPos, length);
   counter.inc();
   copiedCounter.add(length);
   ArrayCopyCallNode.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length, elementKind);
   if (length == 0) {
     zeroLengthDynamicCounter.inc();
   } else {
     nonZeroLengthDynamicCounter.inc();
     nonZeroLengthDynamicCopiedCounter.add(length);
   }
 }