# HG changeset patch # User Andreas Woess # Date 1372161182 -7200 # Node ID 254fab64b34310588c7f02a6a069d01f764d6d47 # Parent 5fb4a450b7a741c3d359f94491cfc5d86f550bae Separate replacements for Truffle compilation diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java Mon Jun 24 17:16:04 2013 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java Tue Jun 25 13:53:02 2013 +0200 @@ -52,12 +52,12 @@ public class PartialEvaluationTest extends GraalCompilerTest { private static final long UNROLL_LIMIT = 100; - private final PartialEvaluator nodeCompiler; + private final PartialEvaluator partialEvaluator; public PartialEvaluationTest() { // Make sure Truffle runtime is initialized. Assert.assertTrue(Truffle.getRuntime() instanceof GraalTruffleRuntime); - this.nodeCompiler = new PartialEvaluator(runtime, runtime); + this.partialEvaluator = new PartialEvaluator(runtime, ((GraalTruffleRuntime) Truffle.getRuntime()).getReplacements()); DebugEnvironment.initialize(System.out); } @@ -103,7 +103,7 @@ @Override public StructuredGraph call() { - StructuredGraph resultGraph = nodeCompiler.createGraph(compilable, assumptions); + StructuredGraph resultGraph = partialEvaluator.createGraph(compilable, assumptions); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(canonicalizeReads); HighTierContext context = new HighTierContext(runtime, assumptions, replacements); diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/GraalTruffleRuntime.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/GraalTruffleRuntime.java Mon Jun 24 17:16:04 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/GraalTruffleRuntime.java Tue Jun 25 13:53:02 2013 +0200 @@ -26,9 +26,7 @@ import java.util.*; -import com.oracle.graal.api.runtime.*; import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.truffle.substitutions.*; import com.oracle.truffle.api.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.impl.*; @@ -44,20 +42,11 @@ } private TruffleCompiler truffleCompiler; + private Replacements truffleReplacements; private ArrayList includes; private ArrayList excludes; private GraalTruffleRuntime() { - Replacements replacements = Graal.getRequiredCapability(Replacements.class); - replacements.registerSubstitutions(CompilerAssertsSubstitutions.class); - replacements.registerSubstitutions(CompilerDirectivesSubstitutions.class); - replacements.registerSubstitutions(ExactMathSubstitutions.class); - replacements.registerSubstitutions(UnexpectedResultExceptionSubstitutions.class); - replacements.registerSubstitutions(SlowPathExceptionSubstitutions.class); - replacements.registerSubstitutions(FrameWithoutBoxingSubstitutions.class); - replacements.registerSubstitutions(OptimizedAssumptionSubstitutions.class); - replacements.registerSubstitutions(OptimizedCallTargetSubstitutions.class); - replacements.registerSubstitutions(DefaultCallTargetSubstitutions.class); } public String getName() { @@ -100,6 +89,13 @@ return new OptimizedAssumption(name); } + public Replacements getReplacements() { + if (truffleReplacements == null) { + truffleReplacements = TruffleReplacements.makeInstance(); + } + return truffleReplacements; + } + private boolean acceptForCompilation(RootNode rootNode) { if (TruffleCompileOnly.getValue() != null) { if (includes == null) { diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Mon Jun 24 17:16:04 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Tue Jun 25 13:53:02 2013 +0200 @@ -30,7 +30,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.api.runtime.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.Node; @@ -72,16 +71,16 @@ private Set constantReceivers; private final HotSpotGraphCache cache; - public PartialEvaluator(GraalCodeCacheProvider runtime, MetaAccessProvider metaAccessProvider) { + public PartialEvaluator(MetaAccessProvider metaAccessProvider, Replacements replacements) { this.metaAccessProvider = metaAccessProvider; - this.nodeClass = runtime.lookupJavaType(com.oracle.truffle.api.nodes.Node.class); - this.customCanonicalizer = new PartialEvaluatorCanonicalizer(runtime, nodeClass); + this.nodeClass = metaAccessProvider.lookupJavaType(com.oracle.truffle.api.nodes.Node.class); + this.customCanonicalizer = new PartialEvaluatorCanonicalizer(metaAccessProvider, nodeClass); this.skippedExceptionTypes = TruffleCompilerImpl.getSkippedExceptionTypes(metaAccessProvider); - this.replacements = Graal.getRequiredCapability(Replacements.class); + this.replacements = replacements; this.cache = HotSpotGraalRuntime.graalRuntime().getCache(); try { - executeHelperMethod = runtime.lookupJavaMethod(OptimizedCallTarget.class.getDeclaredMethod("executeHelper", PackedFrame.class, Arguments.class)); + executeHelperMethod = metaAccessProvider.lookupJavaMethod(OptimizedCallTarget.class.getDeclaredMethod("executeHelper", PackedFrame.class, Arguments.class)); } catch (NoSuchMethodException ex) { throw new RuntimeException(ex); } diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java Mon Jun 24 17:16:04 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluatorCanonicalizer.java Tue Jun 25 13:53:02 2013 +0200 @@ -35,11 +35,11 @@ final class PartialEvaluatorCanonicalizer implements CanonicalizerPhase.CustomCanonicalizer { - private final MetaAccessProvider runtime; + private final MetaAccessProvider metaAccessProvider; private final ResolvedJavaType nodeClass; - PartialEvaluatorCanonicalizer(MetaAccessProvider runtime, ResolvedJavaType nodeClass) { - this.runtime = runtime; + PartialEvaluatorCanonicalizer(MetaAccessProvider metaAccessProvider, ResolvedJavaType nodeClass) { + this.metaAccessProvider = metaAccessProvider; this.nodeClass = nodeClass; } @@ -53,7 +53,7 @@ ((loadFieldNode.kind() == Kind.Object && loadFieldNode.field().getAnnotation(Child.class) != null) || Modifier.isFinal(loadFieldNode.field().getModifiers()) || loadFieldNode.field().getAnnotation( CompilerDirectives.CompilationFinal.class) != null)) { Constant constant = loadFieldNode.field().readValue(loadFieldNode.object().asConstant()); - return ConstantNode.forConstant(constant, this.runtime, node.graph()); + return ConstantNode.forConstant(constant, metaAccessProvider, node.graph()); } } else if (node instanceof LoadIndexedNode) { LoadIndexedNode loadIndexedNode = (LoadIndexedNode) node; @@ -65,7 +65,7 @@ Object array = loadIndexedNode.array().asConstant().asObject(); int index = loadIndexedNode.index().asConstant().asInt(); Object value = Array.get(array, index); - return ConstantNode.forObject(value, this.runtime, node.graph()); + return ConstantNode.forObject(value, metaAccessProvider, node.graph()); } } } else if (node instanceof UnsafeLoadNode) { diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Mon Jun 24 17:16:04 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Tue Jun 25 13:53:02 2013 +0200 @@ -46,6 +46,7 @@ import com.oracle.graal.phases.tiers.*; import com.oracle.graal.printer.*; import com.oracle.graal.truffle.nodes.*; +import com.oracle.truffle.api.*; import com.oracle.truffle.api.nodes.*; /** @@ -55,7 +56,7 @@ private final GraalCodeCacheProvider runtime; private final Suites suites; - private final PartialEvaluator nodeCompiler; + private final PartialEvaluator partialEvaluator; private final MetaAccessProvider metaAccessProvider; private final Replacements replacements; private final Backend backend; @@ -72,10 +73,10 @@ this.suites = Graal.getRequiredCapability(SuitesProvider.class).createSuites(); this.metaAccessProvider = Graal.getRequiredCapability(MetaAccessProvider.class); this.backend = Graal.getRequiredCapability(Backend.class); - this.replacements = Graal.getRequiredCapability(Replacements.class); + this.replacements = ((GraalTruffleRuntime) Truffle.getRuntime()).getReplacements(); this.graalRuntime = HotSpotGraalRuntime.graalRuntime(); - this.nodeCompiler = new PartialEvaluator(runtime, metaAccessProvider); + this.partialEvaluator = new PartialEvaluator(metaAccessProvider, replacements); this.skippedExceptionTypes = getSkippedExceptionTypes(metaAccessProvider); if (DebugEnabled.getValue()) { @@ -110,7 +111,7 @@ compilable.timeCompilationStarted = System.nanoTime(); Assumptions assumptions = new Assumptions(true); - graph = nodeCompiler.createGraph(compilable, assumptions); + graph = partialEvaluator.createGraph(compilable, assumptions); compilable.timePartialEvaluationFinished = System.nanoTime(); compilable.nodeCountPartialEval = graph.getNodeCount(); InstalledCode compiledMethod = compileMethodHelper(graph, config, compilable, assumptions); diff -r 5fb4a450b7a7 -r 254fab64b343 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleReplacements.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleReplacements.java Tue Jun 25 13:53:02 2013 +0200 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2013, 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.truffle; + +import java.util.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.api.replacements.*; +import com.oracle.graal.api.runtime.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.replacements.*; +import com.oracle.graal.truffle.substitutions.*; + +/** + * Custom {@link Replacements} for Truffle compilation. + */ +public final class TruffleReplacements extends ReplacementsImpl { + + private final Replacements graalReplacements; + + private TruffleReplacements(MetaAccessProvider runtime, Assumptions assumptions, TargetDescription target, Replacements graalReplacements) { + super(runtime, assumptions, target); + this.graalReplacements = graalReplacements; + } + + static Replacements makeInstance() { + MetaAccessProvider metaAccessProvider = Graal.getRequiredCapability(MetaAccessProvider.class); + TargetDescription targetDescription = Graal.getRequiredCapability(CodeCacheProvider.class).getTarget(); + Replacements graalReplacements = Graal.getRequiredCapability(Replacements.class); + Replacements truffleReplacements = new TruffleReplacements(metaAccessProvider, graalReplacements.getAssumptions(), targetDescription, graalReplacements); + + truffleReplacements.registerSubstitutions(CompilerAssertsSubstitutions.class); + truffleReplacements.registerSubstitutions(CompilerDirectivesSubstitutions.class); + truffleReplacements.registerSubstitutions(ExactMathSubstitutions.class); + truffleReplacements.registerSubstitutions(UnexpectedResultExceptionSubstitutions.class); + truffleReplacements.registerSubstitutions(SlowPathExceptionSubstitutions.class); + truffleReplacements.registerSubstitutions(FrameWithoutBoxingSubstitutions.class); + truffleReplacements.registerSubstitutions(OptimizedAssumptionSubstitutions.class); + truffleReplacements.registerSubstitutions(OptimizedCallTargetSubstitutions.class); + truffleReplacements.registerSubstitutions(DefaultCallTargetSubstitutions.class); + + return truffleReplacements; + } + + @Override + public StructuredGraph getSnippet(ResolvedJavaMethod method) { + return graalReplacements.getSnippet(method); + } + + @Override + public StructuredGraph getMethodSubstitution(ResolvedJavaMethod method) { + StructuredGraph graph = graalReplacements.getMethodSubstitution(method); + if (graph == null) { + return super.getMethodSubstitution(method); + } + return graph; + } + + @Override + public Class getMacroSubstitution(ResolvedJavaMethod method) { + Class clazz = graalReplacements.getMacroSubstitution(method); + if (clazz == null) { + return super.getMacroSubstitution(method); + } + return clazz; + } + + @Override + public Collection getAllReplacements() { + throw GraalInternalError.shouldNotReachHere(); + } + + @Override + public boolean isForcedSubstitution(ResolvedJavaMethod method) { + return graalReplacements.isForcedSubstitution(method) || super.isForcedSubstitution(method); + } + + @Override + public void registerSnippetTemplateCache(SnippetTemplateCache templates) { + throw GraalInternalError.shouldNotReachHere(); + } + + @Override + public T getSnippetTemplateCache(Class templatesClass) { + return graalReplacements.getSnippetTemplateCache(templatesClass); + } +}