# HG changeset patch # User Doug Simon # Date 1387362397 -3600 # Node ID 8275a0d0c90adc728d2fd1f61abe35fc0a9c3c24 # Parent 02f27ecb4f3a29498fbf4493da9fd4b7c87bb4c6 create profiling info, phase plan and optimistic opts when running a CompilationTask, not when creating it (GRAAL-640) diff -r 02f27ecb4f3a -r 8275a0d0c90a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Wed Dec 18 00:00:24 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Wed Dec 18 11:26:37 2013 +0100 @@ -41,11 +41,15 @@ import com.oracle.graal.debug.internal.*; import com.oracle.graal.hotspot.bridge.*; import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.phases.*; +import com.oracle.graal.java.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.phases.*; +import com.oracle.graal.phases.PhasePlan.*; import com.oracle.graal.phases.tiers.*; +import com.oracle.graal.phases.util.*; public class CompilationTask implements Runnable { @@ -62,9 +66,6 @@ } private final HotSpotBackend backend; - private final PhasePlan plan; - private final OptimisticOptimizations optimisticOpts; - private final ProfilingInfo profilingInfo; private final HotSpotResolvedJavaMethod method; private final int entryBCI; private final int id; @@ -72,18 +73,10 @@ private StructuredGraph graph; - public static CompilationTask create(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo, HotSpotResolvedJavaMethod method, int entryBCI, - int id) { - return new CompilationTask(backend, plan, optimisticOpts, profilingInfo, method, entryBCI, id); - } - - protected CompilationTask(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo, HotSpotResolvedJavaMethod method, int entryBCI, int id) { + public CompilationTask(HotSpotBackend backend, HotSpotResolvedJavaMethod method, int entryBCI, int id) { assert id >= 0; this.backend = backend; - this.plan = plan; this.method = method; - this.optimisticOpts = optimisticOpts; - this.profilingInfo = profilingInfo; this.entryBCI = entryBCI; this.id = id; this.status = new AtomicReference<>(CompilationStatus.Queued); @@ -124,6 +117,27 @@ return providers.getSuites().getDefaultSuites(); } + protected PhasePlan getPhasePlan(Providers providers, OptimisticOptimizations optimisticOpts) { + boolean osrCompilation = entryBCI != StructuredGraph.INVOCATION_ENTRY_BCI; + PhasePlan phasePlan = new PhasePlan(); + MetaAccessProvider metaAccess = providers.getMetaAccess(); + ForeignCallsProvider foreignCalls = providers.getForeignCalls(); + phasePlan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(metaAccess, foreignCalls, GraphBuilderConfiguration.getDefault(), optimisticOpts)); + if (osrCompilation) { + phasePlan.addPhase(PhasePosition.AFTER_PARSING, new OnStackReplacementPhase()); + } + return phasePlan; + } + + protected OptimisticOptimizations getOptimisticOpts(ProfilingInfo profilingInfo) { + return new OptimisticOptimizations(profilingInfo); + } + + protected ProfilingInfo getProfilingInfo() { + boolean osrCompilation = entryBCI != StructuredGraph.INVOCATION_ENTRY_BCI; + return method.getCompilationProfilingInfo(osrCompilation); + } + public void runCompilation(boolean clearFromCompilationQueue) { /* * no code must be outside this try/finally because it could happen otherwise that @@ -169,7 +183,10 @@ InlinedBytecodes.add(method.getCodeSize()); CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); Suites suites = getSuites(providers); - result = compileGraph(graph, cc, method, providers, backend, backend.getTarget(), graphCache, plan, optimisticOpts, profilingInfo, method.getSpeculationLog(), suites, true, + ProfilingInfo profilingInfo = getProfilingInfo(); + OptimisticOptimizations optimisticOpts = getOptimisticOpts(profilingInfo); + PhasePlan phasePlan = getPhasePlan(providers, optimisticOpts); + result = compileGraph(graph, cc, method, providers, backend, backend.getTarget(), graphCache, phasePlan, optimisticOpts, profilingInfo, method.getSpeculationLog(), suites, true, new CompilationResult(), CompilationResultBuilderFactory.Default); } catch (Throwable e) { diff -r 02f27ecb4f3a -r 8275a0d0c90a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompileTheWorld.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompileTheWorld.java Wed Dec 18 00:00:24 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompileTheWorld.java Wed Dec 18 11:26:37 2013 +0100 @@ -43,7 +43,6 @@ import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.options.*; import com.oracle.graal.options.OptionValue.OverrideScope; -import com.oracle.graal.phases.*; import com.oracle.graal.phases.tiers.*; import com.oracle.graal.replacements.*; @@ -318,21 +317,30 @@ TTY.println("CompileTheWorld : Done (%d classes, %d methods, %d ms)", classFileCounter, compiledMethodsCounter, compileTime); } - /** - * A compilation task that creates a fresh compilation suite for its compilation. This is - * required so that a CTW compilation can be {@linkplain Config configured} differently from a - * VM triggered compilation. - */ - static class CTWCompilationTask extends CompilationTask { + class CTWCompilationTask extends CompilationTask { - CTWCompilationTask(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo, HotSpotResolvedJavaMethod method, int entryBCI, int id) { - super(backend, plan, optimisticOpts, profilingInfo, method, entryBCI, id); + CTWCompilationTask(HotSpotBackend backend, HotSpotResolvedJavaMethod method, int id) { + super(backend, method, INVOCATION_ENTRY_BCI, id); } + /** + * Returns a fresh compilation suite for its compilation so that the CTW option value + * overriding configuration has effect. + */ @Override protected Suites getSuites(HotSpotProviders providers) { + assert config.scope != null : "not inside a CTW option value overriding scope"; return providers.getSuites().createSuites(); } + + /** + * Returns empty profiling info to be as close to the CTW behavior of C1 and C2 as possible. + */ + @Override + protected ProfilingInfo getProfilingInfo() { + // Be optimistic and return false for exceptionSeen. + return DefaultProfilingInfo.get(TriState.FALSE); + } } /** @@ -342,13 +350,9 @@ try { long start = System.currentTimeMillis(); - // Be optimistic and return false for exceptionSeen. - final ProfilingInfo profilingInfo = DefaultProfilingInfo.get(TriState.FALSE); - final OptimisticOptimizations optimisticOpts = new OptimisticOptimizations(profilingInfo); int id = vmToCompiler.allocateCompileTaskId(); HotSpotBackend backend = runtime.getHostBackend(); - PhasePlan phasePlan = vmToCompiler.createPhasePlan(backend.getProviders(), optimisticOpts, false); - CompilationTask task = new CTWCompilationTask(backend, phasePlan, optimisticOpts, profilingInfo, method, INVOCATION_ENTRY_BCI, id); + CompilationTask task = new CTWCompilationTask(backend, method, id); task.runCompilation(false); compileTime += (System.currentTimeMillis() - start); diff -r 02f27ecb4f3a -r 8275a0d0c90a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Wed Dec 18 00:00:24 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Wed Dec 18 11:26:37 2013 +0100 @@ -35,7 +35,6 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.*; -import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.CompilerThreadFactory.DebugConfigAccess; @@ -46,12 +45,9 @@ import com.oracle.graal.hotspot.CompileTheWorld.Config; import com.oracle.graal.hotspot.debug.*; import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.hotspot.phases.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; import com.oracle.graal.options.*; -import com.oracle.graal.phases.*; -import com.oracle.graal.phases.PhasePlan.PhasePosition; import com.oracle.graal.printer.*; import com.oracle.graal.replacements.*; @@ -571,7 +567,7 @@ /** * Compiles a method to machine code. */ - public void compileMethod(final HotSpotResolvedJavaMethod method, final int entryBCI, final boolean blocking) { + void compileMethod(final HotSpotResolvedJavaMethod method, final int entryBCI, final boolean blocking) { boolean osrCompilation = entryBCI != StructuredGraph.INVOCATION_ENTRY_BCI; if (osrCompilation && bootstrapRunning) { // no OSR compilations during bootstrap - the compiler is just too slow at this point, @@ -592,11 +588,9 @@ if (method.tryToQueueForCompilation()) { assert method.isQueuedForCompilation(); - final ProfilingInfo profilingInfo = method.getCompilationProfilingInfo(osrCompilation); - final OptimisticOptimizations optimisticOpts = new OptimisticOptimizations(profilingInfo); int id = allocateCompileTaskId(); HotSpotBackend backend = runtime.getHostBackend(); - CompilationTask task = CompilationTask.create(backend, createPhasePlan(backend.getProviders(), optimisticOpts, osrCompilation), optimisticOpts, profilingInfo, method, entryBCI, id); + CompilationTask task = new CompilationTask(backend, method, entryBCI, id); if (blocking) { task.runCompilation(true); @@ -690,17 +684,6 @@ return type; } - public PhasePlan createPhasePlan(HotSpotProviders providers, OptimisticOptimizations optimisticOpts, boolean onStackReplacement) { - PhasePlan phasePlan = new PhasePlan(); - MetaAccessProvider metaAccess = providers.getMetaAccess(); - ForeignCallsProvider foreignCalls = providers.getForeignCalls(); - phasePlan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(metaAccess, foreignCalls, GraphBuilderConfiguration.getDefault(), optimisticOpts)); - if (onStackReplacement) { - phasePlan.addPhase(PhasePosition.AFTER_PARSING, new OnStackReplacementPhase()); - } - return phasePlan; - } - @Override public PrintStream log() { return log;