@Override
 public void lower(LoweringTool tool) {
   if (graph().getGuardsStage().areFrameStatesAtDeopts()) {
     ForeignCallDescriptor desc =
         HotSpotHostForeignCallsProvider.lookupCheckcastArraycopyDescriptor(isUninit());
     StructuredGraph graph = graph();
     ValueNode srcAddr = computeBase(getSource(), getSourcePosition());
     ValueNode destAddr = computeBase(getDestination(), getDestinationPosition());
     ValueNode len = getLength();
     if (len.stamp().getStackKind() != runtime.getTarget().wordJavaKind) {
       len =
           IntegerConvertNode.convert(
               len, StampFactory.forKind(runtime.getTarget().wordJavaKind), graph());
     }
     ForeignCallNode call =
         graph.add(
             new ForeignCallNode(
                 runtime.getHostBackend().getForeignCalls(),
                 desc,
                 srcAddr,
                 destAddr,
                 len,
                 superCheckOffset,
                 destElemKlass));
     call.setStateAfter(stateAfter());
     graph.replaceFixedWithFixed(this, call);
   }
 }
 NodeIntrinsificationPhase getIntrinsifier() {
   if (intrinsifier == null) {
     HotSpotProviders providers = runtime.getHostProviders();
     intrinsifier = new NodeIntrinsificationPhase(providers, providers.getSnippetReflection());
   }
   return intrinsifier;
 }
  public Suites createSuites() {
    Suites ret = Suites.createDefaultSuites();

    if (ImmutableCode.getValue()) {
      // lowering introduces class constants, therefore it must be after lowering
      ret.getHighTier()
          .appendPhase(
              new LoadJavaMirrorWithKlassPhase(
                  runtime.getConfig().classMirrorOffset, runtime.getConfig().getOopEncoding()));
      if (VerifyPhases.getValue()) {
        ret.getHighTier().appendPhase(new AheadOfTimeVerificationPhase());
      }
    }

    ret.getMidTier().appendPhase(new WriteBarrierAdditionPhase(runtime.getConfig()));
    if (VerifyPhases.getValue()) {
      ret.getMidTier().appendPhase(new WriteBarrierVerificationPhase());
    }

    return ret;
  }
 MetaAccessProvider getMetaAccess() {
   return runtime.getHostProviders().getMetaAccess();
 }