# HG changeset patch # User Doug Simon # Date 1386092403 -3600 # Node ID bb35fc7e0d684ab617fca2a441eb562e7437df6b # Parent b429ec5c46d6fbc8794e74cbdbfc43bd19acc8a2# Parent de8f74d496907169e50763a5ab39b4f23b0d23d0 Merge. diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java --- a/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.compiler.ptx.test; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import java.lang.annotation.*; import java.lang.reflect.*; @@ -30,7 +31,6 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.compiler.test.*; import com.oracle.graal.debug.*; @@ -89,7 +89,7 @@ * GPU fallback to CPU in cases of ECC failure on kernel invocation. */ Suites suites = Suites.createDefaultSuites(); - ExternalCompilationResult result = GraalCompiler.compileGraph(graph, cc, graph.method(), getProviders(), ptxBackend, target, null, phasePlan, OptimisticOptimizations.NONE, + ExternalCompilationResult result = compileGraph(graph, cc, graph.method(), getProviders(), ptxBackend, target, null, phasePlan, OptimisticOptimizations.NONE, getProfilingInfo(graph), new SpeculationLog(), suites, true, new ExternalCompilationResult(), CompilationResultBuilderFactory.Default); ResolvedJavaMethod method = graph.method(); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.compiler.test; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.nodes.ConstantNode.*; import static com.oracle.graal.phases.GraalOptions.*; @@ -38,7 +39,6 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; @@ -555,8 +555,8 @@ GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(getMetaAccess(), getForeignCalls(), GraphBuilderConfiguration.getDefault(), OptimisticOptimizations.ALL); phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); CallingConvention cc = getCallingConvention(getCodeCache(), Type.JavaCallee, graph.method(), false); - final CompilationResult compResult = GraalCompiler.compileGraph(graph, cc, method, getProviders(), getBackend(), getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, - new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); + final CompilationResult compResult = compileGraph(graph, cc, method, getProviders(), getBackend(), getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, + getProfilingInfo(graph), new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); if (printCompilation) { TTY.println(String.format("@%-6d Graal %-70s %-45s %-50s | %4dms %5dB", id, "", "", "", System.currentTimeMillis() - start, compResult.getTargetCodeSize())); } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.compiler.test; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static org.junit.Assert.*; import java.lang.reflect.*; @@ -33,7 +34,6 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.code.CompilationResult.Call; import com.oracle.graal.api.code.CompilationResult.Infopoint; -import com.oracle.graal.compiler.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.nodes.*; import com.oracle.graal.phases.*; @@ -60,8 +60,8 @@ final Method method = getMethod("testMethod"); final StructuredGraph graph = parse(method); CallingConvention cc = getCallingConvention(getCodeCache(), Type.JavaCallee, graph.method(), false); - final CompilationResult cr = GraalCompiler.compileGraph(graph, cc, graph.method(), getProviders(), getBackend(), getCodeCache().getTarget(), null, getDefaultPhasePlan(), - OptimisticOptimizations.ALL, new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); + final CompilationResult cr = compileGraph(graph, cc, graph.method(), getProviders(), getBackend(), getCodeCache().getTarget(), null, getDefaultPhasePlan(), OptimisticOptimizations.ALL, + getProfilingInfo(graph), new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); for (Infopoint sp : cr.getInfopoints()) { assertNotNull(sp.reason); if (sp instanceof Call) { @@ -82,8 +82,8 @@ } assertTrue(graphLineSPs > 0); CallingConvention cc = getCallingConvention(getCodeCache(), Type.JavaCallee, graph.method(), false); - final CompilationResult cr = GraalCompiler.compileGraph(graph, cc, graph.method(), getProviders(), getBackend(), getCodeCache().getTarget(), null, getDefaultPhasePlan(true), - OptimisticOptimizations.ALL, new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); + final CompilationResult cr = compileGraph(graph, cc, graph.method(), getProviders(), getBackend(), getCodeCache().getTarget(), null, getDefaultPhasePlan(true), OptimisticOptimizations.ALL, + getProfilingInfo(graph), new SpeculationLog(), getSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); int lineSPs = 0; for (Infopoint sp : cr.getInfopoints()) { assertNotNull(sp.reason); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -605,7 +605,7 @@ new FloatingReadPhase().apply(graph); new RemoveValueProxyPhase().apply(graph); - MidTierContext midContext = new MidTierContext(getProviders(), assumptions, getCodeCache().getTarget(), OptimisticOptimizations.ALL); + MidTierContext midContext = new MidTierContext(getProviders(), assumptions, getCodeCache().getTarget(), OptimisticOptimizations.ALL, graph.method().getProfilingInfo()); new GuardLoweringPhase().apply(graph, midContext); new LoweringPhase(canonicalizer).apply(graph, midContext); new LoweringPhase(canonicalizer).apply(graph, midContext); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -112,7 +112,8 @@ LIR lir = null; try (Scope s = Debug.scope("FrontEnd")) { - lir = GraalCompiler.emitHIR(getProviders(), getBackend().getTarget(), graph, assumptions, null, phasePlan, OptimisticOptimizations.NONE, new SpeculationLog(), getSuites()); + lir = GraalCompiler.emitHIR(getProviders(), getBackend().getTarget(), graph, assumptions, null, phasePlan, OptimisticOptimizations.NONE, graph.method().getProfilingInfo(), + new SpeculationLog(), getSuites()); } catch (Throwable e) { throw Debug.handle(e); } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Dec 03 18:40:03 2013 +0100 @@ -32,6 +32,7 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.CompilationResult.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.api.meta.ProfilingInfo.*; import com.oracle.graal.compiler.alloc.*; import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.target.*; @@ -136,25 +137,24 @@ * @return the result of the compilation */ public static T compileGraph(StructuredGraph graph, CallingConvention cc, ResolvedJavaMethod installedCodeOwner, Providers providers, Backend backend, - TargetDescription target, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts, SpeculationLog speculationLog, Suites suites, boolean withScope, - T compilationResult, CompilationResultBuilderFactory factory) { + TargetDescription target, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo, SpeculationLog speculationLog, Suites suites, + boolean withScope, T compilationResult, CompilationResultBuilderFactory factory) { try (Scope s0 = withScope ? Debug.scope("GraalCompiler", graph, providers.getCodeCache()) : null) { Assumptions assumptions = new Assumptions(OptAssumptions.getValue()); - LIR lir = null; - try (Scope s1 = Debug.scope("FrontEnd"); TimerCloseable a = FrontEnd.start()) { - lir = emitHIR(providers, target, graph, assumptions, cache, plan, optimisticOpts, speculationLog, suites); + try (Scope s = Debug.scope("FrontEnd"); TimerCloseable a = FrontEnd.start()) { + lir = emitHIR(providers, target, graph, assumptions, cache, plan, optimisticOpts, profilingInfo, speculationLog, suites); } catch (Throwable e) { throw Debug.handle(e); } try (TimerCloseable a = BackEnd.start()) { LIRGenerator lirGen = null; - try (Scope s2 = Debug.scope("BackEnd", lir)) { + try (Scope s = Debug.scope("BackEnd", lir)) { lirGen = emitLIR(backend, target, lir, graph, cc); } catch (Throwable e) { throw Debug.handle(e); } - try (Scope s3 = Debug.scope("CodeGen", lirGen)) { + try (Scope s = Debug.scope("CodeGen", lirGen)) { emitCode(backend, getLeafGraphIdArray(graph), assumptions, lirGen, compilationResult, installedCodeOwner, factory); } catch (Throwable e) { throw Debug.handle(e); @@ -163,14 +163,19 @@ throw Debug.handle(e); } } catch (Throwable e) { - if (!withScope) { - throw e; - } throw Debug.handle(e); } return compilationResult; } + public static ProfilingInfo getProfilingInfo(StructuredGraph graph) { + if (graph.method() != null) { + return graph.method().getProfilingInfo(); + } else { + return DefaultProfilingInfo.get(TriState.UNKNOWN); + } + } + private static long[] getLeafGraphIdArray(StructuredGraph graph) { long[] leafGraphIdArray = new long[graph.getLeafGraphIds().size() + 1]; int i = 0; @@ -185,7 +190,7 @@ * Builds the graph, optimizes it. */ public static LIR emitHIR(Providers providers, TargetDescription target, StructuredGraph graph, Assumptions assumptions, GraphCache cache, PhasePlan plan, OptimisticOptimizations optimisticOpts, - SpeculationLog speculationLog, Suites suites) { + ProfilingInfo profilingInfo, SpeculationLog speculationLog, Suites suites) { if (speculationLog != null) { speculationLog.snapshot(); @@ -202,7 +207,7 @@ suites.getHighTier().apply(graph, highTierContext); graph.maybeCompress(); - MidTierContext midTierContext = new MidTierContext(providers, assumptions, target, optimisticOpts); + MidTierContext midTierContext = new MidTierContext(providers, assumptions, target, optimisticOpts, profilingInfo); suites.getMidTier().apply(graph, midTierContext); graph.maybeCompress(); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILCompilationResult.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILCompilationResult.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILCompilationResult.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.hotspot.hsail; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; import java.lang.reflect.*; @@ -31,18 +32,17 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.hotspot.*; -import com.oracle.graal.hotspot.bridge.CompilerToGPU; +import com.oracle.graal.hotspot.bridge.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hsail.*; import com.oracle.graal.java.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.java.MethodCallTargetNode; +import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.PhasePlan.PhasePosition; @@ -176,8 +176,8 @@ CallingConvention cc = getHSAILCallingConvention(Type.JavaCallee, target, graph.method(), false); SuitesProvider suitesProvider = backend.getSuites(); try { - HSAILCompilationResult compResult = GraalCompiler.compileGraph(graph, cc, graph.method(), providers, backend, target, null, phasePlan, OptimisticOptimizations.NONE, new SpeculationLog(), - suitesProvider.getDefaultSuites(), true, new HSAILCompilationResult(), CompilationResultBuilderFactory.Default); + HSAILCompilationResult compResult = compileGraph(graph, cc, graph.method(), providers, backend, target, null, phasePlan, OptimisticOptimizations.NONE, getProfilingInfo(graph), + new SpeculationLog(), suitesProvider.getDefaultSuites(), true, new HSAILCompilationResult(), CompilationResultBuilderFactory.Default); if ((validDevice) && (compResult.getTargetCode() != null)) { long kernel = toGPU.generateKernel(compResult.getTargetCode(), graph.method().getName()); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.hotspot.test; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.nodes.ConstantNode.*; import static com.oracle.graal.phases.GraalOptions.*; @@ -32,7 +33,6 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.test.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.hotspot.meta.*; @@ -208,8 +208,8 @@ CallingConvention cc = getCallingConvention(getCodeCache(), Type.JavaCallee, graph.method(), false); // create suites everytime, as we modify options for the compiler final Suites suitesLocal = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend().getSuites().createSuites(); - final CompilationResult compResult = GraalCompiler.compileGraph(graph, cc, method, getProviders(), getBackend(), getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, - new SpeculationLog(), suitesLocal, true, new CompilationResult(), CompilationResultBuilderFactory.Default); + final CompilationResult compResult = compileGraph(graph, cc, method, getProviders(), getBackend(), getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, + getProfilingInfo(graph), new SpeculationLog(), suitesLocal, true, new CompilationResult(), CompilationResultBuilderFactory.Default); addMethod(method, compResult); } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierAdditionTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -247,7 +247,7 @@ try (Scope s = Debug.scope("WriteBarrierAdditionTest", new DebugDumpScope(snippet))) { StructuredGraph graph = parse(snippet); HighTierContext highContext = new HighTierContext(getProviders(), new Assumptions(false), null, getDefaultPhasePlan(), OptimisticOptimizations.ALL); - MidTierContext midContext = new MidTierContext(getProviders(), new Assumptions(false), getCodeCache().getTarget(), OptimisticOptimizations.ALL); + MidTierContext midContext = new MidTierContext(getProviders(), new Assumptions(false), getCodeCache().getTarget(), OptimisticOptimizations.ALL, graph.method().getProfilingInfo()); new InliningPhase(new InliningPhase.InlineEverythingPolicy(), new CanonicalizerPhase(true)).apply(graph, highContext); new LoweringPhase(new CanonicalizerPhase(true)).apply(graph, highContext); new GuardLoweringPhase().apply(graph, midContext); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java --- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/WriteBarrierVerificationTest.java Tue Dec 03 18:40:03 2013 +0100 @@ -615,7 +615,7 @@ HighTierContext highTierContext = new HighTierContext(getProviders(), new Assumptions(false), null, getDefaultPhasePlan(), OptimisticOptimizations.ALL); new InliningPhase(new CanonicalizerPhase(true)).apply(graph, highTierContext); - MidTierContext midTierContext = new MidTierContext(getProviders(), new Assumptions(false), getCodeCache().getTarget(), OptimisticOptimizations.ALL); + MidTierContext midTierContext = new MidTierContext(getProviders(), new Assumptions(false), getCodeCache().getTarget(), OptimisticOptimizations.ALL, graph.method().getProfilingInfo()); new LoweringPhase(new CanonicalizerPhase(true)).apply(graph, highTierContext); new GuardLoweringPhase().apply(graph, midTierContext); diff -r b429ec5c46d6 -r bb35fc7e0d68 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 Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.hotspot; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.nodes.StructuredGraph.*; import static com.oracle.graal.phases.GraalOptions.*; import static com.oracle.graal.phases.common.InliningUtil.*; @@ -35,7 +36,6 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.CompilerThreadFactory.CompilerThread; -import com.oracle.graal.compiler.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.debug.internal.*; @@ -64,6 +64,7 @@ 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; @@ -71,16 +72,18 @@ private StructuredGraph graph; - public static CompilationTask create(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, HotSpotResolvedJavaMethod method, int entryBCI, int id) { - return new CompilationTask(backend, plan, optimisticOpts, method, entryBCI, id); + 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); } - private CompilationTask(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, HotSpotResolvedJavaMethod method, int entryBCI, int id) { + private CompilationTask(HotSpotBackend backend, PhasePlan plan, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo, 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); @@ -162,7 +165,7 @@ InlinedBytecodes.add(method.getCodeSize()); CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); Suites suites = providers.getSuites().getDefaultSuites(); - result = GraalCompiler.compileGraph(graph, cc, method, providers, backend, backend.getTarget(), graphCache, plan, optimisticOpts, method.getSpeculationLog(), suites, true, + result = compileGraph(graph, cc, method, providers, backend, backend.getTarget(), graphCache, plan, optimisticOpts, profilingInfo, method.getSpeculationLog(), suites, true, new CompilationResult(), CompilationResultBuilderFactory.Default); } catch (Throwable e) { diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Tue Dec 03 18:40:03 2013 +0100 @@ -1145,6 +1145,7 @@ @HotSpotVMConstant(name = "Deoptimization::Reason_constraint") @Stable public int deoptReasonConstraint; @HotSpotVMConstant(name = "Deoptimization::Reason_loop_limit_check") @Stable public int deoptReasonLoopLimitCheck; @HotSpotVMConstant(name = "Deoptimization::Reason_aliasing") @Stable public int deoptReasonAliasing; + @HotSpotVMConstant(name = "Deoptimization::Reason_LIMIT") @Stable public int deoptReasonOSROffset; @HotSpotVMConstant(name = "Deoptimization::Action_none") @Stable public int deoptActionNone; @HotSpotVMConstant(name = "Deoptimization::Action_maybe_recompile") @Stable public int deoptActionMaybeRecompile; diff -r b429ec5c46d6 -r bb35fc7e0d68 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 Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Tue Dec 03 18:40:03 2013 +0100 @@ -576,10 +576,11 @@ if (method.tryToQueueForCompilation()) { assert method.isQueuedForCompilation(); - final OptimisticOptimizations optimisticOpts = new OptimisticOptimizations(method); + final ProfilingInfo profilingInfo = method.getCompilationProfilingInfo(osrCompilation); + final OptimisticOptimizations optimisticOpts = new OptimisticOptimizations(profilingInfo); int id = compileTaskIds.incrementAndGet(); HotSpotBackend backend = runtime.getHostBackend(); - CompilationTask task = CompilationTask.create(backend, createPhasePlan(backend.getProviders(), optimisticOpts, osrCompilation), optimisticOpts, method, entryBCI, id); + CompilationTask task = CompilationTask.create(backend, createPhasePlan(backend.getProviders(), optimisticOpts, osrCompilation), optimisticOpts, profilingInfo, method, entryBCI, id); if (blocking) { task.runCompilation(); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMethodData.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMethodData.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotMethodData.java Tue Dec 03 18:40:03 2013 +0100 @@ -95,6 +95,11 @@ return unsafe.getByte(metaspaceMethodData + config.methodDataOopTrapHistoryOffset + reasonIndex) & 0xFF; } + public int getOSRDeoptimizationCount(DeoptimizationReason reason) { + int reasonIndex = runtime().getHostProviders().getMetaAccess().convertDeoptReason(reason); + return unsafe.getByte(metaspaceMethodData + config.methodDataOopTrapHistoryOffset + config.deoptReasonOSROffset + reasonIndex) & 0xFF; + } + public HotSpotMethodDataAccessor getNormalData(int position) { if (position >= normalDataSize) { return null; diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotProfilingInfo.java Tue Dec 03 18:40:03 2013 +0100 @@ -39,9 +39,14 @@ private int hintBCI; private HotSpotMethodDataAccessor dataAccessor; - public HotSpotProfilingInfo(HotSpotMethodData methodData, HotSpotResolvedJavaMethod method) { + private boolean includeNormal; + private boolean includeOSR; + + public HotSpotProfilingInfo(HotSpotMethodData methodData, HotSpotResolvedJavaMethod method, boolean includeNormal, boolean includeOSR) { this.methodData = methodData; this.method = method; + this.includeNormal = includeNormal; + this.includeOSR = includeOSR; hintPosition = 0; hintBCI = -1; } @@ -95,7 +100,14 @@ @Override public int getDeoptimizationCount(DeoptimizationReason reason) { - return methodData.getDeoptimizationCount(reason); + int count = 0; + if (includeNormal) { + count += methodData.getDeoptimizationCount(reason); + } + if (includeOSR) { + count += methodData.getOSRDeoptimizationCount(reason); + } + return count; } private void findBCI(int targetBCI, boolean searchExtraData) { diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod.java Tue Dec 03 18:40:03 2013 +0100 @@ -287,6 +287,14 @@ @Override public ProfilingInfo getProfilingInfo() { + return getProfilingInfo(true, true); + } + + public ProfilingInfo getCompilationProfilingInfo(boolean isOSR) { + return getProfilingInfo(!isOSR, isOSR); + } + + private ProfilingInfo getProfilingInfo(boolean includeNormal, boolean includeOSR) { ProfilingInfo info; if (UseProfilingInformation.getValue() && methodData == null) { @@ -305,7 +313,7 @@ // case of a deoptimization. info = DefaultProfilingInfo.get(TriState.FALSE); } else { - info = new HotSpotProfilingInfo(methodData, this); + info = new HotSpotProfilingInfo(methodData, this, includeNormal, includeOSR); } return info; } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Tue Dec 03 18:40:03 2013 +0100 @@ -22,13 +22,13 @@ */ package com.oracle.graal.hotspot.stubs; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; import java.util.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; @@ -152,8 +152,8 @@ phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); // The stub itself needs the incoming calling convention. CallingConvention incomingCc = linkage.getIncomingCallingConvention(); - final CompilationResult compResult = GraalCompiler.compileGraph(graph, incomingCc, getInstalledCodeOwner(), providers, backend, codeCache.getTarget(), null, phasePlan, - OptimisticOptimizations.ALL, new SpeculationLog(), providers.getSuites().getDefaultSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); + final CompilationResult compResult = compileGraph(graph, incomingCc, getInstalledCodeOwner(), providers, backend, codeCache.getTarget(), null, phasePlan, OptimisticOptimizations.ALL, + getProfilingInfo(graph), new SpeculationLog(), providers.getSuites().getDefaultSuites(), true, new CompilationResult(), CompilationResultBuilderFactory.Default); assert destroyedRegisters != null; try (Scope s = Debug.scope("CodeInstall")) { diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.java.decompiler.test/src/com/oracle/graal/java/decompiler/test/TestUtil.java --- a/graal/com.oracle.graal.java.decompiler.test/src/com/oracle/graal/java/decompiler/test/TestUtil.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.java.decompiler.test/src/com/oracle/graal/java/decompiler/test/TestUtil.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,12 +23,12 @@ package com.oracle.graal.java.decompiler.test; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.java.*; import com.oracle.graal.lir.asm.*; @@ -54,7 +54,7 @@ GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(metaAccess, foreignCalls, GraphBuilderConfiguration.getDefault(), OptimisticOptimizations.ALL); phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); - GraalCompiler.compileGraph(graph, cc, method, providers, backend, providers.getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, new SpeculationLog(), suites, true, - new CompilationResult(), CompilationResultBuilderFactory.Default); + compileGraph(graph, cc, method, providers, backend, providers.getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, getProfilingInfo(graph), new SpeculationLog(), suites, + true, new CompilationResult(), CompilationResultBuilderFactory.Default); } } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Dec 03 18:40:03 2013 +0100 @@ -1218,14 +1218,14 @@ frameState.pushReturn(resultType, append(invoke)); return invoke; } else { + assert bci() == currentBlock.endBci; + frameState.clearNonLiveLocals(currentBlock.localsLiveOut); + DispatchBeginNode exceptionEdge = handleException(null, bci()); InvokeWithExceptionNode invoke = append(new InvokeWithExceptionNode(callTarget, exceptionEdge, bci())); frameState.pushReturn(resultType, invoke); Block nextBlock = currentBlock.successors.get(0); - assert bci() == currentBlock.endBci; - frameState.clearNonLiveLocals(currentBlock.localsLiveOut); - invoke.setNext(createTarget(nextBlock, frameState)); invoke.setStateAfter(frameState.create(nextBlock.startBci)); return invoke; diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopPolicies.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopPolicies.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopPolicies.java Tue Dec 03 18:40:03 2013 +0100 @@ -38,6 +38,9 @@ // TODO (gd) change when inversion is available public static boolean shouldPeel(LoopEx loop, NodesToDoubles probabilities) { + if (loop.detectCounted()) { + return false; + } LoopBeginNode loopBegin = loop.loopBegin(); double entryProbability = probabilities.get(loopBegin.forwardEnd()); return entryProbability > MinimumPeelProbability.getValue() && loop.size() + loopBegin.graph().getNodeCount() < MaximumDesiredSize.getValue(); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LoadHubNode.java Tue Dec 03 18:40:03 2013 +0100 @@ -61,7 +61,7 @@ @Override public void lower(LoweringTool tool) { - if (graph().getGuardsStage() == StructuredGraph.GuardsStage.FIXED_DEOPTS || graph().getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph().getGuardsStage().ordinal() >= StructuredGraph.GuardsStage.FIXED_DEOPTS.ordinal()) { tool.getLowerer().lower(this, tool); } } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Replacements.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Replacements.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/Replacements.java Tue Dec 03 18:40:03 2013 +0100 @@ -47,12 +47,13 @@ void registerSnippet(ResolvedJavaMethod method); /** - * Prepares the copy of a snippet graph immediately after instantiation. This can be used to do - * node intrinsification for example. + * Notifies this object during snippet specialization once the specialized snippet's constant + * parameters have been replaced with constant values. * - * @param snippetCopy The copy of the snippet graph. + * @param specializedSnippet the snippet in the process of being specialized. This is a copy of + * the unspecialized snippet graph created during snippet preparation. */ - void prepareSnippetCopyAfterInstantiation(StructuredGraph snippetCopy); + void notifyAfterConstantsBound(StructuredGraph specializedSnippet); /** * Gets the graph that is a substitution for a given method. diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Tue Dec 03 18:40:03 2013 +0100 @@ -1268,7 +1268,7 @@ return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it is marked non-inlinable"); } else if (data.countRecursiveInlining(method) > MaximumRecursiveInlining.getValue()) { return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "it exceeds the maximum recursive inlining depth"); - } else if (new OptimisticOptimizations(method).lessOptimisticThan(optimisticOpts)) { + } else if (new OptimisticOptimizations(method.getProfilingInfo()).lessOptimisticThan(optimisticOpts)) { return logNotInlinedMethodAndReturnFalse(invoke, data.inliningDepth(), method, "the callee uses less optimistic optimizations than caller"); } else { return true; diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/OptimisticOptimizations.java Tue Dec 03 18:40:03 2013 +0100 @@ -39,19 +39,19 @@ private final Set enabledOpts; - public OptimisticOptimizations(ResolvedJavaMethod method) { + public OptimisticOptimizations(ProfilingInfo info) { this.enabledOpts = EnumSet.noneOf(Optimization.class); enabledOpts.add(Optimization.UseExceptionProbabilityForOperations); - addOptimization(method, DeoptimizationReason.UnreachedCode, Optimization.RemoveNeverExecutedCode); - addOptimization(method, DeoptimizationReason.TypeCheckedInliningViolated, Optimization.UseTypeCheckedInlining); - addOptimization(method, DeoptimizationReason.OptimizedTypeCheckViolated, Optimization.UseTypeCheckHints); - addOptimization(method, DeoptimizationReason.NotCompiledExceptionHandler, Optimization.UseExceptionProbability); - addOptimization(method, DeoptimizationReason.LoopLimitCheck, Optimization.UseLoopLimitChecks); + addOptimization(info, DeoptimizationReason.UnreachedCode, Optimization.RemoveNeverExecutedCode); + addOptimization(info, DeoptimizationReason.TypeCheckedInliningViolated, Optimization.UseTypeCheckedInlining); + addOptimization(info, DeoptimizationReason.OptimizedTypeCheckViolated, Optimization.UseTypeCheckHints); + addOptimization(info, DeoptimizationReason.NotCompiledExceptionHandler, Optimization.UseExceptionProbability); + addOptimization(info, DeoptimizationReason.LoopLimitCheck, Optimization.UseLoopLimitChecks); } - private void addOptimization(ResolvedJavaMethod method, DeoptimizationReason deoptReason, Optimization optimization) { - if (checkDeoptimizations(method.getProfilingInfo(), deoptReason)) { + private void addOptimization(ProfilingInfo info, DeoptimizationReason deoptReason, Optimization optimization) { + if (checkDeoptimizations(info, deoptReason)) { enabledOpts.add(optimization); } else { disabledOptimisticOptsMetric.increment(); diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/tiers/MidTierContext.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/tiers/MidTierContext.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/tiers/MidTierContext.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.phases.tiers; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.util.*; @@ -30,11 +31,13 @@ private final TargetDescription target; private final OptimisticOptimizations optimisticOpts; + private final ProfilingInfo profilingInfo; - public MidTierContext(Providers copyFrom, Assumptions assumptions, TargetDescription target, OptimisticOptimizations optimisticOpts) { + public MidTierContext(Providers copyFrom, Assumptions assumptions, TargetDescription target, OptimisticOptimizations optimisticOpts, ProfilingInfo profilingInfo) { super(copyFrom, assumptions); this.target = target; this.optimisticOpts = optimisticOpts; + this.profilingInfo = profilingInfo; } public TargetDescription getTarget() { @@ -44,4 +47,8 @@ public OptimisticOptimizations getOptimisticOptimizations() { return optimisticOpts; } + + public ProfilingInfo getProfilingInfo() { + return profilingInfo; + } } diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Tue Dec 03 18:40:03 2013 +0100 @@ -110,13 +110,13 @@ } @Override - public void prepareSnippetCopyAfterInstantiation(StructuredGraph snippetCopy) { + public void notifyAfterConstantsBound(StructuredGraph specializedSnippet) { // Do deferred intrinsification of node intrinsics - new NodeIntrinsificationPhase(providers).apply(snippetCopy); - new CanonicalizerPhase(true).apply(snippetCopy, new PhaseContext(providers, assumptions)); - NodeIntrinsificationVerificationPhase.verify(snippetCopy); + new NodeIntrinsificationPhase(providers).apply(specializedSnippet); + new CanonicalizerPhase(true).apply(specializedSnippet, new PhaseContext(providers, assumptions)); + NodeIntrinsificationVerificationPhase.verify(specializedSnippet); } @Override diff -r b429ec5c46d6 -r bb35fc7e0d68 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Dec 03 18:40:03 2013 +0100 @@ -511,7 +511,7 @@ Debug.dump(snippetCopy, "Before specialization"); if (!nodeReplacements.isEmpty()) { - providers.getReplacements().prepareSnippetCopyAfterInstantiation(snippetCopy); + providers.getReplacements().notifyAfterConstantsBound(snippetCopy); } // Gather the template parameters diff -r b429ec5c46d6 -r bb35fc7e0d68 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 Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/GraalTruffleRuntime.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.truffle; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.truffle.TruffleCompilerOptions.*; import java.lang.reflect.*; @@ -32,7 +33,6 @@ import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; -import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; @@ -206,8 +206,8 @@ CallingConvention cc = getCallingConvention(providers.getCodeCache(), Type.JavaCallee, graph.method(), false); Backend backend = Graal.getRequiredCapability(RuntimeProvider.class).getHostBackend(); CompilationResultBuilderFactory factory = getOptimizedCallTargetInstrumentationFactory(backend.getTarget().arch.getName(), javaMethod); - return GraalCompiler.compileGraph(graph, cc, javaMethod, providers, backend, providers.getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, new SpeculationLog(), suites, - true, new CompilationResult(), factory); + return compileGraph(graph, cc, javaMethod, providers, backend, providers.getCodeCache().getTarget(), null, phasePlan, OptimisticOptimizations.ALL, getProfilingInfo(graph), + new SpeculationLog(), suites, true, new CompilationResult(), factory); } private static Providers getGraalProviders() { diff -r b429ec5c46d6 -r bb35fc7e0d68 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 Tue Dec 03 18:19:56 2013 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerImpl.java Tue Dec 03 18:40:03 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.graal.truffle; import static com.oracle.graal.api.code.CodeUtil.*; +import static com.oracle.graal.compiler.GraalCompiler.*; import static com.oracle.graal.truffle.TruffleCompilerOptions.*; import java.io.*; @@ -222,8 +223,8 @@ CodeCacheProvider codeCache = providers.getCodeCache(); CallingConvention cc = getCallingConvention(codeCache, Type.JavaCallee, graph.method(), false); CompilationResult compilationResult = new CompilationResult(graph.method().toString()); - result = GraalCompiler.compileGraph(graph, cc, graph.method(), providers, backend, codeCache.getTarget(), null, plan, OptimisticOptimizations.ALL, new SpeculationLog(), suites, false, - compilationResult, CompilationResultBuilderFactory.Default); + result = compileGraph(graph, cc, graph.method(), providers, backend, codeCache.getTarget(), null, plan, OptimisticOptimizations.ALL, getProfilingInfo(graph), new SpeculationLog(), suites, + false, compilationResult, CompilationResultBuilderFactory.Default); } catch (Throwable e) { throw Debug.handle(e); } diff -r b429ec5c46d6 -r bb35fc7e0d68 mx/projects --- a/mx/projects Tue Dec 03 18:19:56 2013 +0100 +++ b/mx/projects Tue Dec 03 18:40:03 2013 +0100 @@ -153,7 +153,7 @@ # graal.hotspot.ptx project@com.oracle.graal.hotspot.ptx@subDir=graal project@com.oracle.graal.hotspot.ptx@sourceDirs=src -project@com.oracle.graal.hotspot.ptx@dependencies=com.oracle.graal.ptx,com.oracle.graal.compiler.ptx +project@com.oracle.graal.hotspot.ptx@dependencies=com.oracle.graal.ptx,com.oracle.graal.compiler.ptx,com.oracle.graal.hotspot project@com.oracle.graal.hotspot.ptx@checkstyle=com.oracle.graal.graph project@com.oracle.graal.hotspot.ptx@annotationProcessors=com.oracle.graal.service.processor project@com.oracle.graal.hotspot.ptx@javaCompliance=1.7 diff -r b429ec5c46d6 -r bb35fc7e0d68 src/cpu/x86/vm/templateInterpreter_x86_64.cpp --- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Tue Dec 03 18:40:03 2013 +0100 @@ -207,6 +207,7 @@ __ movptr(Address(rbp, frame::interpreter_frame_last_sp_offset * wordSize), (int32_t)NULL_WORD); __ restore_bcp(); __ restore_locals(); +#ifdef GRAAL // Check if we need to take lock at entry of synchronized method. { Label L; @@ -220,6 +221,7 @@ lock_method(); __ bind(L); } +#endif // handle exceptions { Label L; diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java --- a/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java Tue Dec 03 18:40:03 2013 +0100 @@ -73,7 +73,7 @@ try { serverSocket = ServerSocketChannel.open(); serverSocket.bind(new InetSocketAddress(curPort)); - } catch (IOException ex) { + } catch (Throwable ex) { NotifyDescriptor message = new NotifyDescriptor.Message("Could not create server. Listening for incoming binary data is disabled.", NotifyDescriptor.ERROR_MESSAGE); DialogDisplayer.getDefault().notifyLater(message); return; diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/graal/vmStructs_graal.hpp --- a/src/share/vm/graal/vmStructs_graal.hpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/graal/vmStructs_graal.hpp Tue Dec 03 18:40:03 2013 +0100 @@ -30,6 +30,7 @@ #define VM_STRUCTS_GRAAL(nonstatic_field, static_field) \ static_field(java_lang_Class, _graal_mirror_offset, int) \ + nonstatic_field(ThreadShadow, _pending_deoptimization, int) \ #define VM_TYPES_GRAAL(declare_type, declare_toplevel_type) \ diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/oops/methodData.hpp --- a/src/share/vm/oops/methodData.hpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/oops/methodData.hpp Tue Dec 03 18:40:03 2013 +0100 @@ -1900,7 +1900,11 @@ // Whole-method sticky bits and flags enum { +#ifdef GRAAL + _trap_hist_limit = 18, // decoupled from Deoptimization::Reason_LIMIT +#else _trap_hist_limit = 17, // decoupled from Deoptimization::Reason_LIMIT +#endif _trap_hist_mask = max_jubyte, _extra_data_count = 4 // extra DataLayout headers, for trap history }; // Public flag values @@ -1910,7 +1914,11 @@ uint _nof_overflow_traps; // trap count, excluding _trap_hist union { intptr_t _align; +#ifdef GRAAL + u1 _array[2*_trap_hist_limit]; +#else u1 _array[_trap_hist_limit]; +#endif } _trap_hist; // Support for interprocedural escape analysis, from Thomas Kotzmann. diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/runtime/deoptimization.cpp --- a/src/share/vm/runtime/deoptimization.cpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.cpp Tue Dec 03 18:40:03 2013 +0100 @@ -1368,10 +1368,12 @@ methodHandle trap_method = trap_scope->method(); int trap_bci = trap_scope->bci(); +#ifdef GRAAL if (trap_bci == SynchronizationEntryBCI) { trap_bci = 0; Thread::current()->set_pending_monitorenter(true); } +#endif Bytecodes::Code trap_bc = trap_method->java_code_at(trap_bci); if (trap_scope->rethrow_exception()) { @@ -1618,6 +1620,9 @@ bool maybe_prior_trap = false; bool maybe_prior_recompile = false; pdata = query_update_method_data(trap_mdo, trap_bci, reason, true, +#ifdef GRAAL + nm->is_compiled_by_graal() && nm->is_osr_method(), +#endif //outputs: this_trap_count, maybe_prior_trap, @@ -1752,6 +1757,9 @@ int trap_bci, Deoptimization::DeoptReason reason, bool update_total_trap_count, +#ifdef GRAAL + bool is_osr, +#endif //outputs: uint& ret_this_trap_count, bool& ret_maybe_prior_trap, @@ -1760,8 +1768,14 @@ bool maybe_prior_recompile = false; uint this_trap_count = 0; if (update_total_trap_count) { - uint prior_trap_count = trap_mdo->trap_count(reason); - this_trap_count = trap_mdo->inc_trap_count(reason); + uint idx = reason; +#ifdef GRAAL + if (is_osr) { + idx += Reason_LIMIT; + } +#endif + uint prior_trap_count = trap_mdo->trap_count(idx); + this_trap_count = trap_mdo->inc_trap_count(idx); // If the runtime cannot find a place to store trap history, // it is estimated based on the general condition of the method. @@ -1826,6 +1840,9 @@ query_update_method_data(trap_mdo, trap_bci, (DeoptReason)reason, update_total_counts, +#ifdef GRAAL + false, +#endif ignore_this_trap_count, ignore_maybe_prior_trap, ignore_maybe_prior_recompile); diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/runtime/deoptimization.hpp --- a/src/share/vm/runtime/deoptimization.hpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/runtime/deoptimization.hpp Tue Dec 03 18:40:03 2013 +0100 @@ -378,6 +378,9 @@ int trap_bci, DeoptReason reason, bool update_total_trap_count, +#ifdef GRAAL + bool is_osr, +#endif //outputs: uint& ret_this_trap_count, bool& ret_maybe_prior_trap, diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/runtime/vmStructs.cpp --- a/src/share/vm/runtime/vmStructs.cpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/runtime/vmStructs.cpp Tue Dec 03 18:40:03 2013 +0100 @@ -913,7 +913,6 @@ static_field(Threads, _return_code, int) \ \ nonstatic_field(ThreadShadow, _pending_exception, oop) \ - nonstatic_field(ThreadShadow, _pending_deoptimization, int) \ nonstatic_field(ThreadShadow, _exception_file, const char*) \ nonstatic_field(ThreadShadow, _exception_line, int) \ volatile_nonstatic_field(Thread, _suspend_flags, uint32_t) \ diff -r b429ec5c46d6 -r bb35fc7e0d68 src/share/vm/utilities/exceptions.hpp --- a/src/share/vm/utilities/exceptions.hpp Tue Dec 03 18:19:56 2013 +0100 +++ b/src/share/vm/utilities/exceptions.hpp Tue Dec 03 18:40:03 2013 +0100 @@ -61,8 +61,10 @@ friend class VMStructs; protected: +#ifdef GRAAL int _pending_deoptimization; bool _pending_monitorenter; +#endif oop _pending_exception; // Thread has gc actions. const char* _exception_file; // file information for exception (debugging only) int _exception_line; // line information for exception (debugging only) @@ -78,19 +80,23 @@ public: oop pending_exception() const { return _pending_exception; } - int pending_deoptimization() const { return _pending_deoptimization; } bool has_pending_exception() const { return _pending_exception != NULL; } const char* exception_file() const { return _exception_file; } int exception_line() const { return _exception_line; } +#ifdef GRAAL + int pending_deoptimization() const { return _pending_deoptimization; } bool has_pending_monitorenter() const { return _pending_monitorenter; } +#endif // Code generation support + static ByteSize pending_exception_offset() { return byte_offset_of(ThreadShadow, _pending_exception); } +#ifdef GRAAL static ByteSize pending_deoptimization_offset() { return byte_offset_of(ThreadShadow, _pending_deoptimization); } - static ByteSize pending_exception_offset() { return byte_offset_of(ThreadShadow, _pending_exception); } static ByteSize pending_monitorenter_offset() { return byte_offset_of(ThreadShadow, _pending_monitorenter); } void set_pending_monitorenter(bool b) { _pending_monitorenter = b; } void set_pending_deoptimization(int reason) { _pending_deoptimization = reason; } +#endif // use THROW whenever possible! void set_pending_exception(oop exception, const char* file, int line); @@ -99,7 +105,11 @@ void clear_pending_exception(); ThreadShadow() : _pending_exception(NULL), - _exception_file(NULL), _exception_line(0), _pending_monitorenter(false), _pending_deoptimization(-1) {} + _exception_file(NULL), _exception_line(0) +#ifdef GRAAL + , _pending_monitorenter(false), _pending_deoptimization(-1) +#endif + {} };