< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/replacements/aot/ResolveConstantSnippets.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 34,44 ****
--- 34,46 ----
import org.graalvm.compiler.hotspot.nodes.aot.EncodedSymbolNode;
import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassNode;
import org.graalvm.compiler.hotspot.nodes.aot.InitializeKlassStubCall;
import org.graalvm.compiler.hotspot.nodes.aot.LoadConstantIndirectlyNode;
import org.graalvm.compiler.hotspot.nodes.aot.LoadMethodCountersIndirectlyNode;
+ import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicStubCall;
import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantNode;
+ import org.graalvm.compiler.hotspot.nodes.aot.ResolveDynamicConstantNode;
import org.graalvm.compiler.hotspot.nodes.aot.ResolveConstantStubCall;
import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersNode;
import org.graalvm.compiler.hotspot.nodes.aot.ResolveMethodAndLoadCountersStubCall;
import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
import org.graalvm.compiler.hotspot.word.KlassPointer;
*** 71,80 ****
--- 73,91 ----
}
return result;
}
@Snippet
+ public static Object resolveDynamicConstant(Object constant) {
+ Object result = LoadConstantIndirectlyNode.loadObject(constant);
+ if (probability(VERY_SLOW_PATH_PROBABILITY, result == null)) {
+ result = ResolveDynamicStubCall.resolveInvoke(constant);
+ }
+ return result;
+ }
+
+ @Snippet
public static KlassPointer resolveKlassConstant(KlassPointer constant) {
KlassPointer result = LoadConstantIndirectlyNode.loadKlass(constant);
if (probability(VERY_SLOW_PATH_PROBABILITY, result.isNull())) {
result = ResolveConstantStubCall.resolveKlass(constant, EncodedSymbolNode.encode(constant));
}
*** 108,126 ****
--- 119,157 ----
return result;
}
public static class Templates extends AbstractTemplates {
private final SnippetInfo resolveObjectConstant = snippet(ResolveConstantSnippets.class, "resolveObjectConstant");
+ private final SnippetInfo resolveDynamicConstant = snippet(ResolveConstantSnippets.class, "resolveDynamicConstant");
private final SnippetInfo resolveKlassConstant = snippet(ResolveConstantSnippets.class, "resolveKlassConstant");
private final SnippetInfo resolveMethodAndLoadCounters = snippet(ResolveConstantSnippets.class, "resolveMethodAndLoadCounters");
private final SnippetInfo initializeKlass = snippet(ResolveConstantSnippets.class, "initializeKlass");
private final SnippetInfo pureInitializeKlass = snippet(ResolveConstantSnippets.class, "pureInitializeKlass");
public Templates(OptionValues options, Iterable<DebugHandlersFactory> factories, HotSpotProviders providers, TargetDescription target) {
super(options, factories, providers, providers.getSnippetReflection(), target);
}
+ public void lower(ResolveDynamicConstantNode resolveConstantNode, LoweringTool tool) {
+ StructuredGraph graph = resolveConstantNode.graph();
+
+ ValueNode value = resolveConstantNode.value();
+ assert value.isConstant() : "Expected a constant: " + value;
+ SnippetInfo snippet = resolveDynamicConstant;
+
+ Arguments args = new Arguments(snippet, graph.getGuardsStage(), tool.getLoweringStage());
+ args.add("constant", value);
+
+ SnippetTemplate template = template(graph.getDebug(), args);
+ template.instantiate(providers.getMetaAccess(), resolveConstantNode, DEFAULT_REPLACER, args);
+
+ assert resolveConstantNode.hasNoUsages();
+ if (!resolveConstantNode.isDeleted()) {
+ GraphUtil.killWithUnusedFloatingInputs(resolveConstantNode);
+ }
+ }
+
public void lower(ResolveConstantNode resolveConstantNode, LoweringTool tool) {
StructuredGraph graph = resolveConstantNode.graph();
ValueNode value = resolveConstantNode.value();
assert value.isConstant() : "Expected a constant: " + value;
< prev index next >