use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class NativeImageGenerator method registerReplacements.
@SuppressWarnings("try")
public static void registerReplacements(DebugContext debug, FeatureHandler featureHandler, RuntimeConfiguration runtimeConfig, Providers providers, SnippetReflectionProvider snippetReflection, boolean hosted) {
OptionValues options = hosted ? HostedOptionValues.singleton() : RuntimeOptionValues.singleton();
Providers runtimeCallProviders = runtimeConfig != null ? runtimeConfig.getBackendForNormalMethod().getProviders() : providers;
SubstrateForeignCallsProvider foreignCallsProvider = (SubstrateForeignCallsProvider) providers.getForeignCalls();
for (SubstrateForeignCallDescriptor descriptor : SnippetRuntime.getRuntimeCalls()) {
foreignCallsProvider.getForeignCalls().put(descriptor, new SubstrateForeignCallLinkage(runtimeCallProviders, descriptor));
}
featureHandler.forEachGraalFeature(feature -> feature.registerForeignCalls(runtimeConfig, runtimeCallProviders, snippetReflection, foreignCallsProvider.getForeignCalls(), hosted));
try (DebugContext.Scope s = debug.scope("RegisterLowerings", new DebugDumpScope("RegisterLowerings"))) {
SubstrateLoweringProvider lowerer = (SubstrateLoweringProvider) providers.getLowerer();
Map<Class<? extends Node>, NodeLoweringProvider<?>> lowerings = lowerer.getLowerings();
Iterable<DebugHandlersFactory> factories = runtimeConfig != null ? runtimeConfig.getDebugHandlersFactories() : Collections.singletonList(new GraalDebugHandlersFactory(snippetReflection));
lowerer.setConfiguration(runtimeConfig, options, factories, providers, snippetReflection);
NonSnippetLowerings.registerLowerings(runtimeConfig, options, factories, providers, snippetReflection, lowerings);
ArithmeticSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
MonitorSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
TypeSnippets.registerLowerings(runtimeConfig, options, factories, providers, snippetReflection, lowerings);
ExceptionSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
if (hosted) {
AssertSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
DeoptHostedSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
} else {
DeoptRuntimeSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
}
if (NativeImageOptions.DeoptimizeAll.getValue()) {
DeoptTestSnippets.registerLowerings(options, factories, providers, snippetReflection, lowerings);
}
featureHandler.forEachGraalFeature(feature -> feature.registerLowerings(runtimeConfig, options, factories, providers, snippetReflection, lowerings, hosted));
} catch (Throwable e) {
throw debug.handle(e);
}
SubstrateReplacements replacements = (SubstrateReplacements) providers.getReplacements();
assert checkInvocationPluginMethods(replacements);
replacements.encodeSnippets();
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class CompileQueue method insertDeoptTests.
/**
* Inserts a call to {@link DeoptTester#deoptTest} right after FixedWithNextNode StateSplits.
*
* @param method method that is being augmented with deopt test calls
* @param graph The graph of a deoptimizable method or the corresponding deopt target method.
*/
private static void insertDeoptTests(HostedMethod method, StructuredGraph graph) {
for (Node node : graph.getNodes()) {
if (node instanceof FixedWithNextNode && node instanceof StateSplit && !(node instanceof InvokeNode) && !(node instanceof ForeignCallNode) && !(node instanceof DeoptTestNode) && !(method.isSynchronized() && node instanceof StartNode)) {
FixedWithNextNode fixedWithNext = (FixedWithNextNode) node;
FixedNode next = fixedWithNext.next();
DeoptTestNode testNode = graph.add(new DeoptTestNode());
fixedWithNext.setNext(null);
testNode.setNext(next);
fixedWithNext.setNext(testNode);
}
}
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class InliningUtilities method isTrivialMethod.
public static boolean isTrivialMethod(StructuredGraph graph) {
int numInvokes = 0;
int numOthers = 0;
for (Node n : graph.getNodes()) {
if (n instanceof StartNode || n instanceof ParameterNode || n instanceof FullInfopointNode || n instanceof ValueProxy || n instanceof AssertValueNode) {
continue;
}
if (n instanceof MethodCallTargetNode) {
numInvokes++;
} else {
numOthers++;
}
if (!shouldBeTrivial(numInvokes, numOthers, graph)) {
return false;
}
}
return true;
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class UninterruptibleAnnotationChecker method checkUninterruptibleAllocations.
/**
* Check that each method that is annotated with {@linkplain Uninterruptible} contains no
* allocations.
*/
@SuppressWarnings("try")
private void checkUninterruptibleAllocations(DebugContext debug) {
for (HostedMethod method : methodCollection) {
try (DebugContext.Scope s = debug.scope("CheckUninterruptibleAllocations", method.compilationInfo.graph, method, this)) {
Uninterruptible methodAnnotation = method.getAnnotation(Uninterruptible.class);
StructuredGraph graph = method.compilationInfo.getGraph();
if (methodAnnotation != null && graph != null) {
for (Node node : graph.getNodes()) {
if (node instanceof AbstractNewObjectNode) {
postUninterruptibleWarning("Annotated method: " + method.format("%h.%n(%p)") + " allocates.");
}
}
}
} catch (Throwable t) {
throw debug.handle(t);
}
}
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class NodeLIRBuilder method matchComplexExpressions.
@SuppressWarnings("try")
protected void matchComplexExpressions(List<Node> nodes) {
if (matchRules != null) {
DebugContext debug = gen.getResult().getLIR().getDebug();
try (DebugContext.Scope s = debug.scope("MatchComplexExpressions")) {
if (LogVerbose.getValue(nodeOperands.graph().getOptions())) {
int i = 0;
for (Node node : nodes) {
debug.log("%d: (%s) %1S", i++, node.getUsageCount(), node);
}
}
// Match the nodes in backwards order to encourage longer matches.
for (int index = nodes.size() - 1; index >= 0; index--) {
Node node = nodes.get(index);
if (getOperand(node) != null) {
continue;
}
// See if this node is the root of any MatchStatements
List<MatchStatement> statements = matchRules.get(node.getClass());
if (statements != null) {
for (MatchStatement statement : statements) {
if (statement.generate(this, index, node, nodes)) {
// Found a match so skip to the next
break;
}
}
}
}
}
}
}
Aggregations