# HG changeset patch # User Christian Haeubl # Date 1331690013 25200 # Node ID 6766253384bfe22d54d6f9767a9e1325ad497ee8 # Parent b07ead3a3c2c17608ca8316f6b9b0b90f3ad44e0 more preparations for disabling runtime feedback selectively based on deoptimization history diff -r b07ead3a3c2c -r 6766253384bf 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 Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Mar 13 18:53:33 2012 -0700 @@ -38,6 +38,7 @@ import com.oracle.graal.compiler.schedule.*; import com.oracle.graal.compiler.target.*; import com.oracle.graal.compiler.types.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.lir.*; @@ -74,11 +75,7 @@ this.backend = backend; } - public CiTargetMethod compileMethod(RiResolvedMethod method, int osrBCI, PhasePlan plan) { - return compileMethod(method, new StructuredGraph(method), osrBCI, plan); - } - - public CiTargetMethod compileMethod(final RiResolvedMethod method, final StructuredGraph graph, int osrBCI, final PhasePlan plan) { + public CiTargetMethod compileMethod(final RiResolvedMethod method, final StructuredGraph graph, int osrBCI, final PhasePlan plan, final ProfilingInfoConfiguration profilingInfoConfig) { assert (method.accessFlags() & Modifier.NATIVE) == 0 : "compiling native methods is not supported"; if (osrBCI != -1) { throw new CiBailout("No OSR supported"); @@ -89,7 +86,7 @@ final CiAssumptions assumptions = GraalOptions.OptAssumptions ? new CiAssumptions() : null; final LIR lir = Debug.scope("FrontEnd", new Callable() { public LIR call() { - return emitHIR(graph, assumptions, plan); + return emitHIR(graph, assumptions, plan, profilingInfoConfig); } }); final FrameMap frameMap = Debug.scope("BackEnd", lir, new Callable() { @@ -126,7 +123,7 @@ /** * Builds the graph, optimizes it. */ - public LIR emitHIR(StructuredGraph graph, CiAssumptions assumptions, PhasePlan plan) { + public LIR emitHIR(StructuredGraph graph, CiAssumptions assumptions, PhasePlan plan, ProfilingInfoConfiguration profilingInfoConfig) { if (graph.start().next() == null) { plan.runPhases(PhasePosition.AFTER_PARSING, graph); @@ -154,7 +151,7 @@ } if (GraalOptions.Inline && !plan.isPhaseDisabled(InliningPhase.class)) { - new InliningPhase(target, runtime, null, assumptions, plan).apply(graph); + new InliningPhase(target, runtime, null, assumptions, plan, profilingInfoConfig).apply(graph); new DeadCodeEliminationPhase().apply(graph); new PhiStampPhase().apply(graph); } @@ -174,7 +171,7 @@ } if (GraalOptions.EscapeAnalysis && !plan.isPhaseDisabled(EscapeAnalysisPhase.class)) { - new EscapeAnalysisPhase(target, runtime, assumptions, plan).apply(graph); + new EscapeAnalysisPhase(target, runtime, assumptions, plan, profilingInfoConfig).apply(graph); new PhiStampPhase().apply(graph); if (GraalOptions.OptCanonicalizer) { new CanonicalizerPhase(target, runtime, assumptions).apply(graph); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Mar 13 18:53:33 2012 -0700 @@ -744,7 +744,7 @@ } @Override - public void emitGuardCheck(BooleanNode comp) { + public void emitGuardCheck(BooleanNode comp, RiDeoptReason deoptReason) { if (comp instanceof NullCheckNode && !((NullCheckNode) comp).expectedNull) { emitNullCheckGuard((NullCheckNode) comp); } else if (comp instanceof ConstantNode && comp.asConstant().asBoolean()) { @@ -752,7 +752,7 @@ } else { // Fall back to a normal branch. LIRDebugInfo info = state(); - LabelRef stubEntry = createDeoptStub(RiDeoptAction.InvalidateReprofile, info, comp); + LabelRef stubEntry = createDeoptStub(RiDeoptAction.InvalidateReprofile, deoptReason, info, comp); emitBranch(comp, null, stubEntry, info); } } @@ -985,7 +985,7 @@ } - protected abstract LabelRef createDeoptStub(RiDeoptAction action, LIRDebugInfo info, Object deoptInfo); + protected abstract LabelRef createDeoptStub(RiDeoptAction action, RiDeoptReason reason, LIRDebugInfo info, Object deoptInfo); @Override public Variable emitCallToRuntime(CiRuntimeCall runtimeCall, boolean canTrap, CiValue... args) { diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/ConvertDeoptimizeToGuardPhase.java Tue Mar 13 18:53:33 2012 -0700 @@ -79,7 +79,7 @@ } BeginNode ifBlockBegin = findBeginNode(ifNode); Debug.log("Converting %s on %-5s branch of %s to guard for remaining branch %s. IfBegin=%s", deopt, deoptBegin == ifNode.trueSuccessor() ? "true" : "false", ifNode, otherBegin, ifBlockBegin); - FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode)); + FixedGuardNode guard = graph.add(new FixedGuardNode(conditionNode, deopt.reason())); otherBegin.replaceAtUsages(ifBlockBegin); FixedNode next = otherBegin.next(); otherBegin.setNext(null); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/EscapeAnalysisPhase.java Tue Mar 13 18:53:33 2012 -0700 @@ -215,12 +215,14 @@ private final GraalRuntime runtime; private final CiAssumptions assumptions; private final PhasePlan plan; + private final ProfilingInfoConfiguration profilingInfoConfig; - public EscapeAnalysisPhase(CiTarget target, GraalRuntime runtime, CiAssumptions assumptions, PhasePlan plan) { + public EscapeAnalysisPhase(CiTarget target, GraalRuntime runtime, CiAssumptions assumptions, PhasePlan plan, ProfilingInfoConfiguration profilingInfoConfig) { this.runtime = runtime; this.target = target; this.assumptions = assumptions; this.plan = plan; + this.profilingInfoConfig = profilingInfoConfig; } public static class EscapeRecord { @@ -387,7 +389,7 @@ if (GraalOptions.TraceEscapeAnalysis || GraalOptions.PrintEscapeAnalysis) { TTY.println("Trying inlining to get a non-escaping object for %s", node); } - new InliningPhase(target, runtime, invokes, assumptions, plan).apply(graph); + new InliningPhase(target, runtime, invokes, assumptions, plan, profilingInfoConfig).apply(graph); new DeadCodeEliminationPhase().apply(graph); if (node.isDeleted()) { if (GraalOptions.TraceEscapeAnalysis || GraalOptions.PrintEscapeAnalysis) { diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/InliningPhase.java Tue Mar 13 18:53:33 2012 -0700 @@ -54,6 +54,7 @@ private CiAssumptions assumptions; private final PhasePlan plan; + private final boolean allowTypeCheckedInlining; private final WeightComputationPolicy weightComputationPolicy; private final InliningPolicy inliningPolicy; @@ -62,12 +63,13 @@ private static final DebugMetric metricInliningConsidered = Debug.metric("InliningConsidered"); private static final DebugMetric metricInliningStoppedByMaxDesiredSize = Debug.metric("InliningStoppedByMaxDesiredSize"); - public InliningPhase(CiTarget target, GraalRuntime runtime, Collection hints, CiAssumptions assumptions, PhasePlan plan) { + public InliningPhase(CiTarget target, GraalRuntime runtime, Collection hints, CiAssumptions assumptions, PhasePlan plan, ProfilingInfoConfiguration profilingInfoConfig) { this.target = target; this.runtime = runtime; this.hints = hints; this.assumptions = assumptions; this.plan = plan; + this.allowTypeCheckedInlining = profilingInfoConfig.useTypeProfile(); this.weightComputationPolicy = createWeightComputationPolicy(); this.inliningPolicy = createInliningPolicy(); } @@ -139,7 +141,7 @@ } private void scanInvoke(Invoke invoke, int level) { - InlineInfo info = InliningUtil.getInlineInfo(invoke, level >= 0 ? level : computeInliningLevel(invoke), runtime, assumptions, this); + InlineInfo info = InliningUtil.getInlineInfo(invoke, level >= 0 ? level : computeInliningLevel(invoke), runtime, assumptions, this, allowTypeCheckedInlining); if (info != null) { assert level == -1 || computeInliningLevel(invoke) == level : "outer FramesStates must match inlining level"; metricInliningConsidered.increment(); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoweringPhase.java Tue Mar 13 18:53:33 2012 -0700 @@ -28,6 +28,7 @@ import com.oracle.graal.lir.cfg.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.max.cri.ri.*; public class LoweringPhase extends Phase { @@ -59,7 +60,7 @@ } @Override - public Node createGuard(Node condition) { + public Node createGuard(Node condition, RiDeoptReason deoptReason) { // TODO (thomaswue): Docuemnt why this must not be called on floating nodes. throw new UnsupportedOperationException(); } @@ -117,7 +118,7 @@ } @Override - public Node createGuard(Node condition) { + public Node createGuard(Node condition, RiDeoptReason deoptReason) { FixedNode guardAnchor = (FixedNode) getGuardAnchor(); if (GraalOptions.OptEliminateGuards) { for (Node usage : condition.usages()) { @@ -126,7 +127,7 @@ } } } - GuardNode newGuard = guardAnchor.graph().unique(new GuardNode((BooleanNode) condition, guardAnchor)); + GuardNode newGuard = guardAnchor.graph().unique(new GuardNode((BooleanNode) condition, guardAnchor, deoptReason)); activeGuards.grow(); activeGuards.mark(newGuard); return newGuard; diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/PhasePlan.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/PhasePlan.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/PhasePlan.java Tue Mar 13 18:53:33 2012 -0700 @@ -53,11 +53,8 @@ LOW_LEVEL } - public static final PhasePlan DEFAULT = new PhasePlan(); - @SuppressWarnings("unchecked") private final ArrayList[] phases = new ArrayList[PhasePosition.values().length]; - private final Set> disabledPhases = new HashSet<>(); public void addPhase(PhasePosition pos, Phase phase) { diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java Tue Mar 13 18:53:33 2012 -0700 @@ -37,10 +37,12 @@ public final Label label = new Label(); public final LIRDebugInfo info; public final RiDeoptAction action; + public final RiDeoptReason reason; public final Object deoptInfo; - public AMD64DeoptimizationStub(RiDeoptAction action, LIRDebugInfo info, Object deoptInfo) { + public AMD64DeoptimizationStub(RiDeoptAction action, RiDeoptReason reason, LIRDebugInfo info, Object deoptInfo) { this.action = action; + this.reason = reason; this.info = info; this.deoptInfo = deoptInfo; } @@ -61,9 +63,16 @@ AMD64Call.directCall(tasm, masm, CiRuntimeCall.SetDeoptInfo, info); } - masm.movq(scratch, action.value()); - // TODO Make this an explicit calling convention instead of using a scratch register + masm.movq(scratch, encodeDeoptActionAndReason(action, reason)); + // TODO Make this an explicit calling convention instead of using a scratch register AMD64Call.directCall(tasm, masm, CiRuntimeCall.Deoptimize, info); AMD64Call.shouldNotReachHere(tasm, masm); } + + public static int encodeDeoptActionAndReason(RiDeoptAction action, RiDeoptReason reason) { + int a = action.value(); + int r = reason.value(); + assert NumUtil.isUShort(a) && NumUtil.isUShort(r) : "both values are encoded in one uint"; + return (a << 16) | r; + } } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java Tue Mar 13 18:53:33 2012 -0700 @@ -499,9 +499,9 @@ @Override - public void emitDeoptimizeOn(Condition cond, RiDeoptAction action, Object deoptInfo) { + public void emitDeoptimizeOn(Condition cond, RiDeoptAction action, RiDeoptReason reason, Object deoptInfo) { LIRDebugInfo info = state(); - LabelRef stubEntry = createDeoptStub(action, info, deoptInfo); + LabelRef stubEntry = createDeoptStub(action, reason, info, deoptInfo); if (cond != null) { append(new BranchOp(cond, stubEntry, info)); } else { @@ -546,9 +546,9 @@ } @Override - protected LabelRef createDeoptStub(RiDeoptAction action, LIRDebugInfo info, Object deoptInfo) { + protected LabelRef createDeoptStub(RiDeoptAction action, RiDeoptReason reason, LIRDebugInfo info, Object deoptInfo) { assert info.topFrame.bci >= 0 : "invalid bci for deopt framestate"; - AMD64DeoptimizationStub stub = new AMD64DeoptimizationStub(action, info, deoptInfo); + AMD64DeoptimizationStub stub = new AMD64DeoptimizationStub(action, reason, info, deoptInfo); lir.deoptimizationStubs.add(stub); return LabelRef.forLabel(stub.label); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/InliningUtil.java Tue Mar 13 18:53:33 2012 -0700 @@ -175,7 +175,7 @@ ValueNode receiver = invoke.callTarget().receiver(); ReadHubNode objectClass = graph.add(new ReadHubNode(receiver)); IsTypeNode isTypeNode = graph.unique(new IsTypeNode(objectClass, type)); - FixedGuardNode guard = graph.add(new FixedGuardNode(isTypeNode)); + FixedGuardNode guard = graph.add(new FixedGuardNode(isTypeNode, RiDeoptReason.TypeCheckedInliningViolated)); AnchorNode anchor = graph.add(new AnchorNode()); assert invoke.predecessor() != null; @@ -303,7 +303,7 @@ if (shouldFallbackToInvoke()) { unknownTypeNode = createInvocationBlock(graph, invoke, returnMerge, returnValuePhi, exceptionMerge, exceptionObjectPhi, 1, notRecordedTypeProbability, false); } else { - unknownTypeNode = graph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile)); + unknownTypeNode = graph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile, RiDeoptReason.TypeCheckedInliningViolated)); } // replace the invoke exception edge @@ -368,7 +368,7 @@ ReadHubNode objectClassNode = graph.add(new ReadHubNode(invoke.callTarget().receiver())); graph.addBeforeFixed(invoke.node(), objectClassNode); - FixedNode unknownTypeNode = graph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile)); + FixedNode unknownTypeNode = graph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile, RiDeoptReason.TypeCheckedInliningViolated)); FixedNode dispatchOnType = createDispatchOnType(graph, objectClassNode, new BeginNode[] {calleeEntryNode}, unknownTypeNode); FixedWithNextNode pred = (FixedWithNextNode) invoke.node().predecessor(); @@ -540,7 +540,7 @@ * @param callback a callback that is used to determine the weight of a specific inlining * @return an instance of InlineInfo, or null if no inlining is possible at the given invoke */ - public static InlineInfo getInlineInfo(Invoke invoke, int level, GraalRuntime runtime, CiAssumptions assumptions, InliningCallback callback) { + public static InlineInfo getInlineInfo(Invoke invoke, int level, GraalRuntime runtime, CiAssumptions assumptions, InliningCallback callback, boolean allowTypeCheckedInlining) { if (!checkInvokeConditions(invoke)) { return null; } @@ -591,6 +591,15 @@ } // type check based inlining + if (allowTypeCheckedInlining) { + return getTypeCheckedInlineInfo(invoke, level, callback, parent, targetMethod); + } else { + Debug.log("not inlining %s because type checked inlining is prohibited", methodName(targetMethod, invoke)); + return null; + } + } + + private static InlineInfo getTypeCheckedInlineInfo(Invoke invoke, int level, InliningCallback callback, RiResolvedMethod parent, RiResolvedMethod targetMethod) { RiProfilingInfo profilingInfo = parent.profilingInfo(); RiTypeProfile typeProfile = profilingInfo.getTypeProfile(invoke.bci()); if (typeProfile != null) { @@ -811,7 +820,7 @@ } else { if (unwindNode != null) { UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode); - DeoptimizeNode deoptimizeNode = new DeoptimizeNode(RiDeoptAction.InvalidateRecompile); + DeoptimizeNode deoptimizeNode = new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.NotCompiledExceptionHandler); unwindDuplicate.replaceAndDelete(graph.add(deoptimizeNode)); // move the deopt upwards if there is a monitor exit that tries to use the "after exception" frame state // (because there is no "after exception" frame state!) @@ -899,7 +908,7 @@ NodeInputList parameters = callTarget.arguments(); ValueNode firstParam = parameters.size() <= 0 ? null : parameters.get(0); if (!callTarget.isStatic() && firstParam.kind() == CiKind.Object && !firstParam.stamp().nonNull()) { - graph.addBeforeFixed(invoke.node(), graph.add(new FixedGuardNode(graph.unique(new NullCheckNode(firstParam, false))))); + graph.addBeforeFixed(invoke.node(), graph.add(new FixedGuardNode(graph.unique(new NullCheckNode(firstParam, false)), RiDeoptReason.TypeCheckFailed))); } } } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/ProfilingInfoConfiguration.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/util/ProfilingInfoConfiguration.java Tue Mar 13 18:53:33 2012 -0700 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2012, 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.compiler.util; + + +public final class ProfilingInfoConfiguration { + public static ProfilingInfoConfiguration ALL = new ProfilingInfoConfiguration(true, true, true); + public static ProfilingInfoConfiguration NONE = new ProfilingInfoConfiguration(false, false, false); + + private final boolean useBranchProbability; + private final boolean useTypeProfile; + private final boolean useExceptionSeen; + + public ProfilingInfoConfiguration(boolean useBranchProbability, boolean useTypeProfile, boolean useExceptionSeen) { + this.useBranchProbability = useBranchProbability; + this.useTypeProfile = useTypeProfile; + this.useExceptionSeen = useExceptionSeen; + } + + public boolean useBranchProbability() { + return useBranchProbability; + } + + public boolean useTypeProfile() { + return useTypeProfile; + } + + public boolean useExceptionProbability() { + return useExceptionSeen; + } +} diff -r b07ead3a3c2c -r 6766253384bf 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 Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/bridge/VMToCompilerImpl.java Tue Mar 13 18:53:33 2012 -0700 @@ -33,6 +33,7 @@ import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.PhasePosition; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.debug.internal.*; import com.oracle.graal.hotspot.*; @@ -41,6 +42,7 @@ import com.oracle.graal.hotspot.server.*; import com.oracle.graal.hotspot.snippets.*; import com.oracle.graal.java.*; +import com.oracle.graal.nodes.*; import com.oracle.graal.snippets.*; /** @@ -122,10 +124,10 @@ @Override public void run() { VMToCompilerImpl.this.intrinsifyArrayCopy = new IntrinsifyArrayCopyPhase(runtime); - GraalIntrinsics.installIntrinsics(runtime, runtime.getCompiler().getTarget(), PhasePlan.DEFAULT); - Snippets.install(runtime, runtime.getCompiler().getTarget(), new SystemSnippets(), PhasePlan.DEFAULT); - Snippets.install(runtime, runtime.getCompiler().getTarget(), new UnsafeSnippets(), PhasePlan.DEFAULT); - Snippets.install(runtime, runtime.getCompiler().getTarget(), new ArrayCopySnippets(), PhasePlan.DEFAULT); + GraalIntrinsics.installIntrinsics(runtime, runtime.getCompiler().getTarget()); + Snippets.install(runtime, runtime.getCompiler().getTarget(), new SystemSnippets()); + Snippets.install(runtime, runtime.getCompiler().getTarget(), new UnsafeSnippets()); + Snippets.install(runtime, runtime.getCompiler().getTarget(), new ArrayCopySnippets()); } }); @@ -298,9 +300,8 @@ public void run() { try { - final PhasePlan plan = getDefaultPhasePlan(); - GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(compiler.getRuntime(), GraphBuilderConfiguration.getDefault()); - plan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); + final ProfilingInfoConfiguration profilingInfoConfig = new ProfilingInfoConfiguration(true, true, true); + final PhasePlan plan = createHotSpotSpecificPhasePlan(profilingInfoConfig); long startTime = System.nanoTime(); int index = compiledMethodCount++; final boolean printCompilation = GraalOptions.PrintCompilation && !TTY.isSuppressed(); @@ -315,7 +316,8 @@ result = Debug.scope("Compiling", new Callable() { @Override public CiTargetMethod call() throws Exception { - return compiler.getCompiler().compileMethod(method, -1, plan); + StructuredGraph graph = new StructuredGraph(method); + return compiler.getCompiler().compileMethod(method, graph, -1, plan, profilingInfoConfig); } }); } finally { @@ -448,8 +450,10 @@ return CiConstant.forObject(object); } - private PhasePlan getDefaultPhasePlan() { + private PhasePlan createHotSpotSpecificPhasePlan(ProfilingInfoConfiguration profilingInfoConfig) { PhasePlan phasePlan = new PhasePlan(); + GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(compiler.getRuntime(), GraphBuilderConfiguration.getDefault(), profilingInfoConfig); + phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); if (GraalOptions.Intrinsify) { phasePlan.addPhase(PhasePosition.HIGH_LEVEL, intrinsifyArrayCopy); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotRuntime.java Tue Mar 13 18:53:33 2012 -0700 @@ -36,6 +36,7 @@ import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.cri.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.*; @@ -228,7 +229,7 @@ int displacement = ((HotSpotField) field.field()).offset(); assert field.kind() != CiKind.Illegal; ReadNode memoryRead = graph.add(new ReadNode(field.field().kind(true).stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(true), displacement, graph))); - memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(field.object(), false)))); + memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(field.object(), false)), RiDeoptReason.NullCheckFailed)); graph.replaceFixedWithFixed(field, memoryRead); } else if (n instanceof StoreFieldNode) { StoreFieldNode storeField = (StoreFieldNode) n; @@ -237,7 +238,7 @@ } HotSpotField field = (HotSpotField) storeField.field(); WriteNode memoryWrite = graph.add(new WriteNode(storeField.object(), storeField.value(), LocationNode.create(storeField.field(), storeField.field().kind(true), field.offset(), graph))); - memoryWrite.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(storeField.object(), false)))); + memoryWrite.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(storeField.object(), false)), RiDeoptReason.NullCheckFailed)); memoryWrite.setStateAfter(storeField.stateAfter()); graph.replaceFixedWithFixed(storeField, memoryWrite); @@ -276,7 +277,7 @@ } else { AnchorNode anchor = graph.add(new AnchorNode()); graph.addBeforeFixed(storeIndexed, anchor); - GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(array, false))); + GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(array, false)), RiDeoptReason.NullCheckFailed); ReadNode arrayClass = graph.add(new ReadNode(CiKind.Object, array, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph))); arrayClass.setGuard(guard); graph.addBeforeFixed(storeIndexed, arrayClass); @@ -299,7 +300,7 @@ IndexedLocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, load.loadKind(), load.displacement(), load.offset(), graph); location.setIndexScalingEnabled(false); ReadNode memoryRead = graph.add(new ReadNode(load.kind(), load.object(), location)); - memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(load.object(), false)))); + memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(load.object(), false)), RiDeoptReason.NullCheckFailed)); graph.replaceFixedWithFixed(load, memoryRead); } else if (n instanceof UnsafeStoreNode) { UnsafeStoreNode store = (UnsafeStoreNode) n; @@ -317,7 +318,7 @@ ReadHubNode objectClassNode = (ReadHubNode) n; LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph); ReadNode memoryRead = graph.add(new ReadNode(CiKind.Object, objectClassNode.object(), location)); - memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(objectClassNode.object(), false)))); + memoryRead.setGuard((GuardNode) tool.createGuard(graph.unique(new NullCheckNode(objectClassNode.object(), false)), RiDeoptReason.NullCheckFailed)); graph.replaceFixed(objectClassNode, memoryRead); } } @@ -327,7 +328,7 @@ } private static GuardNode createBoundsCheck(AccessIndexedNode n, CiLoweringTool tool) { - return (GuardNode) tool.createGuard(n.graph().unique(new CompareNode(n.index(), Condition.BT, n.length()))); + return (GuardNode) tool.createGuard(n.graph().unique(new CompareNode(n.index(), Condition.BT, n.length())), RiDeoptReason.BoundsCheckFailed); } @Override @@ -423,8 +424,8 @@ @Override public CiTargetMethod compile(RiResolvedMethod method, StructuredGraph graph) { final PhasePlan plan = new PhasePlan(); - GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(compiler.getRuntime(), GraphBuilderConfiguration.getDefault()); + GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(compiler.getRuntime(), GraphBuilderConfiguration.getDefault(), ProfilingInfoConfiguration.ALL); plan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); - return compiler.getCompiler().compileMethod(method, graph, -1, plan); + return compiler.getCompiler().compileMethod(method, graph, -1, plan, ProfilingInfoConfiguration.ALL); } } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotXirGenerator.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotXirGenerator.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/ri/HotSpotXirGenerator.java Tue Mar 13 18:53:33 2012 -0700 @@ -39,6 +39,7 @@ import com.oracle.max.cri.xir.*; import com.oracle.max.cri.xir.CiXirAssembler.*; import com.oracle.graal.compiler.*; +import com.oracle.graal.compiler.target.amd64.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.Compiler; @@ -710,10 +711,10 @@ asm.jneq(end, objHub, asm.o(null)); } } + + RiDeoptReason deoptReason = is(EXACT_HINTS, flags) ? RiDeoptReason.TypeCheckAssumptionViolated : RiDeoptReason.TypeCheckFailed; XirOperand scratch = asm.createRegisterTemp("scratch", target.wordKind, AMD64.r10); - - asm.mov(scratch, wordConst(asm, RiDeoptAction.InvalidateReprofile.value())); - + asm.mov(scratch, wordConst(asm, AMD64DeoptimizationStub.encodeDeoptActionAndReason(RiDeoptAction.InvalidateReprofile, deoptReason))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.shouldNotReachHere(); @@ -891,7 +892,7 @@ if (is(BOUNDS_CHECK, flags)) { asm.bindOutOfLine(failBoundsCheck); XirOperand scratch = asm.createRegisterTemp("scratch", target.wordKind, AMD64.r10); - asm.mov(scratch, wordConst(asm, RiDeoptAction.None.value())); + asm.mov(scratch, wordConst(asm, AMD64DeoptimizationStub.encodeDeoptActionAndReason(RiDeoptAction.None, RiDeoptReason.BoundsCheckFailed))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.shouldNotReachHere(); } @@ -1081,7 +1082,7 @@ checkSubtype(asm, temp, valueHub, compHub); asm.jneq(store, temp, wordConst(asm, 0)); XirOperand scratch = asm.createRegisterTemp("scratch", target.wordKind, AMD64.r10); - asm.mov(scratch, wordConst(asm, RiDeoptAction.None.value())); + asm.mov(scratch, wordConst(asm, AMD64DeoptimizationStub.encodeDeoptActionAndReason(RiDeoptAction.None, RiDeoptReason.TypeCheckFailed))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.jmp(store); } @@ -1162,7 +1163,7 @@ if (is(BOUNDS_CHECK, flags)) { asm.bindOutOfLine(failBoundsCheck); XirOperand scratch = asm.createRegisterTemp("scratch", target.wordKind, AMD64.r10); - asm.mov(scratch, wordConst(asm, RiDeoptAction.None.value())); + asm.mov(scratch, wordConst(asm, AMD64DeoptimizationStub.encodeDeoptActionAndReason(RiDeoptAction.None, RiDeoptReason.BoundsCheckFailed))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.shouldNotReachHere(); } @@ -1172,7 +1173,7 @@ checkSubtype(asm, temp, valueHub, compHub); asm.jneq(store, temp, wordConst(asm, 0)); XirOperand scratch = asm.createRegisterTemp("scratch", target.wordKind, AMD64.r10); - asm.mov(scratch, wordConst(asm, RiDeoptAction.None.value())); + asm.mov(scratch, wordConst(asm, AMD64DeoptimizationStub.encodeDeoptActionAndReason(RiDeoptAction.None, RiDeoptReason.TypeCheckFailed))); asm.callRuntime(CiRuntimeCall.Deoptimize, null); asm.shouldNotReachHere(); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Tue Mar 13 18:53:33 2012 -0700 @@ -26,14 +26,14 @@ import java.util.*; - -import com.oracle.max.cri.ci.*; -import com.oracle.max.cri.ri.*; import com.oracle.graal.compiler.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.java.bytecode.*; import com.oracle.graal.nodes.*; +import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ri.*; /** * Builds a mapping between bytecodes and basic blocks and builds a conservative control flow @@ -183,27 +183,23 @@ * The blocks found in this method, in reverse postorder. */ public final List blocks; - public final RiResolvedMethod method; - - private final BytecodeStream stream; - - private final RiExceptionHandler[] exceptionHandlers; + public final BitSet canTrap; + public boolean hasJsrBytecodes; + public Block startBlock; + private final ProfilingInfoConfiguration profilingInfoConfig; + private final BytecodeStream stream; + private final RiExceptionHandler[] exceptionHandlers; private Block[] blockMap; - public final BitSet canTrap; - - public boolean hasJsrBytecodes; - - public Block startBlock; - /** * Creates a new BlockMap instance from bytecode of the given method . * @param method the compiler interface method containing the code */ - public BciBlockMapping(RiResolvedMethod method) { + public BciBlockMapping(RiResolvedMethod method, ProfilingInfoConfiguration profilingInfoConfig) { this.method = method; + this.profilingInfoConfig = profilingInfoConfig; exceptionHandlers = method.exceptionHandlers(); stream = new BytecodeStream(method.code()); this.blockMap = new Block[method.codeSize()]; @@ -380,8 +376,10 @@ case SALOAD: case PUTFIELD: case GETFIELD: { - if (GraalOptions.AllowExplicitExceptionChecks && (!GraalOptions.UseExceptionProbability || profilingInfo.getExceptionSeen(bci) != RiExceptionSeen.FALSE)) { - canTrap.set(bci); + if (GraalOptions.AllowExplicitExceptionChecks) { + if (!GraalOptions.UseExceptionProbability || !profilingInfoConfig.useExceptionProbability() || profilingInfo.getExceptionSeen(bci) != RiExceptionSeen.FALSE) { + canTrap.set(bci); + } } } } diff -r b07ead3a3c2c -r 6766253384bf 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 Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Tue Mar 13 18:53:33 2012 -0700 @@ -90,7 +90,8 @@ public static final Map cachedGraphs = new WeakHashMap<>(); - private final GraphBuilderConfiguration config; + private final GraphBuilderConfiguration graphBuilderConfig; + private final ProfilingInfoConfiguration profilingInfoConfig; /** @@ -105,8 +106,9 @@ } } - public GraphBuilderPhase(RiRuntime runtime, GraphBuilderConfiguration config) { - this.config = config; + public GraphBuilderPhase(RiRuntime runtime, GraphBuilderConfiguration graphBuilderConfig, ProfilingInfoConfiguration profilingInfoConfig) { + this.graphBuilderConfig = graphBuilderConfig; + this.profilingInfoConfig = profilingInfoConfig; this.runtime = runtime; this.log = GraalOptions.TraceBytecodeParserLevel > 0 ? new LogStream(TTY.out()) : null; } @@ -123,7 +125,7 @@ methodSynchronizedObject = null; exceptionHandlers = null; this.currentGraph = graph; - this.frameState = new FrameStateBuilder(method, graph, config.eagerResolving()); + this.frameState = new FrameStateBuilder(method, graph, graphBuilderConfig.eagerResolving()); build(); } @@ -133,7 +135,7 @@ } private BciBlockMapping createBlockMap() { - BciBlockMapping map = new BciBlockMapping(method); + BciBlockMapping map = new BciBlockMapping(method, profilingInfoConfig); map.build(); Debug.dump(map, CiUtil.format("After block building %f %R %H.%n(%P)", method)); @@ -249,7 +251,7 @@ private BeginNode handleException(ValueNode exceptionObject, int bci) { assert bci == FrameState.BEFORE_BCI || bci == bci() : "invalid bci"; - if (GraalOptions.UseExceptionProbability) { + if (GraalOptions.UseExceptionProbability && profilingInfoConfig.useExceptionProbability()) { // be conservative if information was not recorded (could result in endless recompiles otherwise) if (bci != FrameState.BEFORE_BCI && exceptionObject == null && profilingInfo.getExceptionSeen(bci) == RiExceptionSeen.FALSE) { return null; @@ -322,7 +324,7 @@ if (riType instanceof RiResolvedType) { frameState.push(CiKind.Object, append(ConstantNode.forCiConstant(((RiResolvedType) riType).getEncoding(Representation.JavaClass), runtime, currentGraph))); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.push(CiKind.Object, append(ConstantNode.forObject(null, runtime, currentGraph))); } } else if (con instanceof CiConstant) { @@ -581,7 +583,7 @@ private void genThrow(int bci) { ValueNode exception = frameState.apop(); - FixedGuardNode node = currentGraph.add(new FixedGuardNode(currentGraph.unique(new NullCheckNode(exception, false)))); + FixedGuardNode node = currentGraph.add(new FixedGuardNode(currentGraph.unique(new NullCheckNode(exception, false)), RiDeoptReason.NullCheckFailed)); append(node); append(handleException(exception, bci)); } @@ -589,39 +591,39 @@ private RiType lookupType(int cpi, int bytecode) { eagerResolvingForSnippets(cpi, bytecode); RiType result = constantPool.lookupType(cpi, bytecode); - assert !config.eagerResolvingForSnippets() || result instanceof RiResolvedType; + assert !graphBuilderConfig.eagerResolvingForSnippets() || result instanceof RiResolvedType; return result; } private RiMethod lookupMethod(int cpi, int opcode) { eagerResolvingForSnippets(cpi, opcode); RiMethod result = constantPool.lookupMethod(cpi, opcode); - assert !config.eagerResolvingForSnippets() || ((result instanceof RiResolvedMethod) && ((RiResolvedMethod) result).holder().isInitialized()); + assert !graphBuilderConfig.eagerResolvingForSnippets() || ((result instanceof RiResolvedMethod) && ((RiResolvedMethod) result).holder().isInitialized()); return result; } private RiField lookupField(int cpi, int opcode) { eagerResolvingForSnippets(cpi, opcode); RiField result = constantPool.lookupField(cpi, opcode); - assert !config.eagerResolvingForSnippets() || (result instanceof RiResolvedField && ((RiResolvedField) result).holder().isInitialized()); + assert !graphBuilderConfig.eagerResolvingForSnippets() || (result instanceof RiResolvedField && ((RiResolvedField) result).holder().isInitialized()); return result; } private Object lookupConstant(int cpi, int opcode) { eagerResolving(cpi, opcode); Object result = constantPool.lookupConstant(cpi); - assert !config.eagerResolving() || !(result instanceof RiType) || (result instanceof RiResolvedType); + assert !graphBuilderConfig.eagerResolving() || !(result instanceof RiType) || (result instanceof RiResolvedType); return result; } private void eagerResolving(int cpi, int bytecode) { - if (config.eagerResolving()) { + if (graphBuilderConfig.eagerResolving()) { constantPool.loadReferencedType(cpi, bytecode); } } private void eagerResolvingForSnippets(int cpi, int bytecode) { - if (config.eagerResolvingForSnippets()) { + if (graphBuilderConfig.eagerResolvingForSnippets()) { constantPool.loadReferencedType(cpi, bytecode); } } @@ -629,7 +631,7 @@ private static final RiResolvedType[] EMPTY_TYPE_ARRAY = new RiResolvedType[0]; private RiResolvedType[] getTypeCheckHints(RiResolvedType type, int maxHints) { - if (!GraalOptions.UseTypeCheckHints || Util.isFinalClass(type)) { + if (!GraalOptions.UseTypeCheckHints || !profilingInfoConfig.useTypeProfile() || Util.isFinalClass(type)) { return new RiResolvedType[] {type}; } else { RiResolvedType uniqueSubtype = type.uniqueConcreteSubtype(); @@ -673,7 +675,7 @@ frameState.apush(checkCast); } else { ValueNode object = frameState.apop(); - append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(object, Condition.EQ, ConstantNode.forObject(null, runtime, currentGraph)))))); + append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(object, Condition.EQ, ConstantNode.forObject(null, runtime, currentGraph))), RiDeoptReason.Unresolved))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -691,7 +693,7 @@ frameState.ipush(append(MaterializeNode.create(currentGraph.unique(instanceOfNode), currentGraph))); } else { BlockPlaceholderNode trueSucc = currentGraph.add(new BlockPlaceholderNode()); - DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile)); + DeoptimizeNode deopt = currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved)); IfNode ifNode = currentGraph.add(new IfNode(currentGraph.unique(new NullCheckNode(object, true)), trueSucc, deopt, 1)); append(ifNode); lastInstr = trueSucc; @@ -705,7 +707,7 @@ NewInstanceNode n = currentGraph.add(new NewInstanceNode((RiResolvedType) type)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -746,7 +748,7 @@ NewArrayNode n = currentGraph.add(new NewObjectArrayNode((RiResolvedType) type, length)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } @@ -763,7 +765,7 @@ FixedWithNextNode n = currentGraph.add(new NewMultiArrayNode((RiResolvedType) type, dims)); frameState.apush(append(n)); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.apush(appendConstant(CiConstant.NULL_OBJECT)); } } @@ -777,7 +779,7 @@ LoadFieldNode load = currentGraph.add(new LoadFieldNode(receiver, (RiResolvedField) field)); appendOptimizedLoadField(kind, load); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.push(kind.stackKind(), append(ConstantNode.defaultForKind(kind, currentGraph))); } } @@ -878,7 +880,7 @@ StoreFieldNode store = currentGraph.add(new StoreFieldNode(receiver, (RiResolvedField) field, value)); appendOptimizedStoreField(store); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); } } @@ -920,7 +922,7 @@ if (initialized) { return appendConstant(((RiResolvedType) holder).getEncoding(representation)); } else { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); return null; } } @@ -981,7 +983,7 @@ } private void genInvokeDeopt(RiMethod unresolvedTarget, boolean withReceiver) { - append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + append(currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, RiDeoptReason.Unresolved))); frameState.popArguments(unresolvedTarget.signature().argumentSlots(withReceiver), unresolvedTarget.signature().argumentCount(withReceiver)); CiKind kind = unresolvedTarget.signature().returnKind(false); if (kind != CiKind.Void) { @@ -1018,7 +1020,7 @@ private void appendInvoke(InvokeKind invokeKind, RiResolvedMethod targetMethod, ValueNode[] args) { CiKind resultType = targetMethod.signature().returnKind(false); if (GraalOptions.DeoptALot) { - DeoptimizeNode deoptimize = currentGraph.add(new DeoptimizeNode(RiDeoptAction.None)); + DeoptimizeNode deoptimize = currentGraph.add(new DeoptimizeNode(RiDeoptAction.None, RiDeoptReason.DeoptimizeALot)); deoptimize.setMessage("invoke " + targetMethod.name()); append(deoptimize); frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, currentGraph)); @@ -1107,7 +1109,7 @@ ValueNode local = frameState.loadLocal(localIndex); JsrScope scope = currentBlock.jsrScope; int retAddress = scope.nextReturnAddress(); - append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(local, Condition.EQ, ConstantNode.forJsr(retAddress, currentGraph)))))); + append(currentGraph.add(new FixedGuardNode(currentGraph.unique(new CompareNode(local, Condition.EQ, ConstantNode.forJsr(retAddress, currentGraph))), RiDeoptReason.JavaSubroutineMismatch))); if (!successor.jsrScope.equals(scope.pop())) { throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)"); } @@ -1192,8 +1194,8 @@ private FixedNode createTarget(double probability, Block block, FrameStateBuilder stateAfter) { assert probability >= 0 && probability <= 1; - if (probability == 0 && GraalOptions.RemoveNeverExecutedCode) { - return currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile)); + if (probability == 0 && GraalOptions.RemoveNeverExecutedCode && profilingInfoConfig.useBranchProbability()) { + return currentGraph.add(new DeoptimizeNode(RiDeoptAction.InvalidateReprofile, RiDeoptReason.UnreachedCode)); } else { return createTarget(block, stateAfter); } @@ -1397,13 +1399,13 @@ assert frameState.stackSize() == 1 : frameState; RiType catchType = block.handler.catchType(); - if (config.eagerResolving()) { + if (graphBuilderConfig.eagerResolving()) { catchType = lookupType(block.handler.catchTypeCPI(), INSTANCEOF); } boolean initialized = (catchType instanceof RiResolvedType); - if (initialized && config.getSkippedExceptionTypes() != null) { + if (initialized && graphBuilderConfig.getSkippedExceptionTypes() != null) { RiResolvedType resolvedCatchType = (RiResolvedType) catchType; - for (RiResolvedType skippedType : config.getSkippedExceptionTypes()) { + for (RiResolvedType skippedType : graphBuilderConfig.getSkippedExceptionTypes()) { initialized &= !resolvedCatchType.isSubtypeOf(skippedType); if (!initialized) { break; diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/CiLoweringTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/CiLoweringTool.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/cri/CiLoweringTool.java Tue Mar 13 18:53:33 2012 -0700 @@ -23,10 +23,11 @@ package com.oracle.graal.cri; import com.oracle.graal.graph.*; +import com.oracle.max.cri.ri.*; public interface CiLoweringTool { GraalRuntime getRuntime(); Node getGuardAnchor(); - Node createGuard(Node condition); + Node createGuard(Node condition, RiDeoptReason deoptReason); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java Tue Mar 13 18:53:33 2012 -0700 @@ -32,14 +32,12 @@ @Data private String message; @Data private final RiDeoptAction action; + @Data private final RiDeoptReason reason; - public DeoptimizeNode() { - this(RiDeoptAction.InvalidateReprofile); - } - - public DeoptimizeNode(RiDeoptAction action) { + public DeoptimizeNode(RiDeoptAction action, RiDeoptReason reason) { super(StampFactory.illegal()); this.action = action; + this.reason = reason; } public void setMessage(String message) { @@ -54,9 +52,13 @@ return action; } + public RiDeoptReason reason() { + return reason; + } + @Override public void generate(LIRGeneratorTool gen) { - gen.emitDeoptimizeOn(null, action, message); + gen.emitDeoptimizeOn(null, action, reason, message); } @NodeIntrinsic diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Tue Mar 13 18:53:33 2012 -0700 @@ -31,16 +31,18 @@ public final class FixedGuardNode extends FixedWithNextNode implements Simplifiable, Lowerable, LIRLowerable { @Input private final NodeInputList conditions; + @Data private final RiDeoptReason deoptReason; - public FixedGuardNode(BooleanNode condition) { + public FixedGuardNode(BooleanNode condition, RiDeoptReason deoptReason) { super(StampFactory.illegal()); this.conditions = new NodeInputList<>(this, new BooleanNode[] {condition}); + this.deoptReason = deoptReason; } @Override public void generate(LIRGeneratorTool gen) { for (BooleanNode condition : conditions()) { - gen.emitGuardCheck(condition); + gen.emitGuardCheck(condition, deoptReason); } } @@ -64,7 +66,7 @@ if (next != null) { tool.deleteBranch(next); } - setNext(graph().add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile))); + setNext(graph().add(new DeoptimizeNode(RiDeoptAction.InvalidateRecompile, deoptReason))); return; } } @@ -78,7 +80,7 @@ public void lower(CiLoweringTool tool) { AnchorNode newAnchor = graph().add(new AnchorNode()); for (BooleanNode b : conditions) { - newAnchor.addGuard((GuardNode) tool.createGuard(b)); + newAnchor.addGuard((GuardNode) tool.createGuard(b, deoptReason)); } ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Tue Mar 13 18:53:33 2012 -0700 @@ -25,11 +25,13 @@ import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.max.cri.ri.*; public final class GuardNode extends FloatingNode implements Canonicalizable, LIRLowerable { @Input private BooleanNode condition; @Input(notDataflow = true) private FixedNode anchor; + @Data private RiDeoptReason reason; public FixedNode anchor() { return anchor; @@ -47,15 +49,20 @@ return condition; } - public GuardNode(BooleanNode condition, FixedNode anchor) { + public RiDeoptReason reason() { + return reason; + } + + public GuardNode(BooleanNode condition, FixedNode anchor, RiDeoptReason reason) { super(StampFactory.illegal()); this.condition = condition; this.anchor = anchor; + this.reason = reason; } @Override public void generate(LIRGeneratorTool gen) { - gen.emitGuardCheck(condition()); + gen.emitGuardCheck(condition(), reason()); } @Override diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeReadNode.java Tue Mar 13 18:53:33 2012 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.extended; import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ri.*; import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; @@ -39,7 +40,7 @@ @Override public void lower(CiLoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); - GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false))); + GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false)), RiDeoptReason.NullCheckExceptionn); ReadNode read = graph.add(new ReadNode(kind(), object(), location())); read.setGuard(guard); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/SafeWriteNode.java Tue Mar 13 18:53:33 2012 -0700 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.extended; import com.oracle.max.cri.ci.*; +import com.oracle.max.cri.ri.*; import com.oracle.graal.cri.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; @@ -45,7 +46,7 @@ @Override public void lower(CiLoweringTool tool) { StructuredGraph graph = (StructuredGraph) graph(); - GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false))); + GuardNode guard = (GuardNode) tool.createGuard(graph.unique(new NullCheckNode(object(), false)), RiDeoptReason.NullCheckFailed); WriteNode write = graph.add(new WriteNode(object(), value(), location())); write.setGuard(guard); graph.replaceFixedWithFixed(this, write); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Tue Mar 13 18:53:33 2012 -0700 @@ -79,12 +79,12 @@ public abstract CiValue emitConvert(ConvertNode.Op opcode, CiValue inputVal); public abstract void emitMembar(int barriers); - public abstract void emitDeoptimizeOn(Condition of, RiDeoptAction action, Object deoptInfo); + public abstract void emitDeoptimizeOn(Condition of, RiDeoptAction action, RiDeoptReason reason, Object deoptInfo); public abstract CiValue emitCallToRuntime(CiRuntimeCall runtimeCall, boolean canTrap, CiValue... args); public abstract void emitIf(IfNode i); public abstract void emitConditional(ConditionalNode i); - public abstract void emitGuardCheck(BooleanNode comp); + public abstract void emitGuardCheck(BooleanNode comp, RiDeoptReason deoptReason); public abstract void emitLookupSwitch(LookupSwitchNode i); public abstract void emitTableSwitch(TableSwitchNode i); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/GraalIntrinsics.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/GraalIntrinsics.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/GraalIntrinsics.java Tue Mar 13 18:53:33 2012 -0700 @@ -22,21 +22,20 @@ */ package com.oracle.graal.snippets; +import com.oracle.graal.compiler.*; +import com.oracle.graal.cri.*; import com.oracle.max.cri.ci.*; -import com.oracle.graal.compiler.*; -import com.oracle.graal.compiler.phases.*; -import com.oracle.graal.cri.*; /** * Definition of the snippets that are VM-independent and can be intrinsified by Graal in any VM. */ public class GraalIntrinsics { - public static void installIntrinsics(GraalRuntime runtime, CiTarget target, PhasePlan plan) { + public static void installIntrinsics(GraalRuntime runtime, CiTarget target) { if (GraalOptions.Intrinsify) { - Snippets.install(runtime, target, new MathSnippetsX86(), plan); - Snippets.install(runtime, target, new DoubleSnippets(), plan); - Snippets.install(runtime, target, new FloatSnippets(), plan); - Snippets.install(runtime, target, new NodeClassSnippets(), plan); + Snippets.install(runtime, target, new MathSnippetsX86()); + Snippets.install(runtime, target, new DoubleSnippets()); + Snippets.install(runtime, target, new FloatSnippets()); + Snippets.install(runtime, target, new NodeClassSnippets()); } } } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java --- a/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.snippets/src/com/oracle/graal/snippets/Snippets.java Tue Mar 13 18:53:33 2012 -0700 @@ -43,17 +43,17 @@ */ public class Snippets { - public static void install(GraalRuntime runtime, CiTarget target, SnippetsInterface obj, PhasePlan plan) { + public static void install(GraalRuntime runtime, CiTarget target, SnippetsInterface obj) { Class clazz = obj.getClass(); BoxingMethodPool pool = new BoxingMethodPool(runtime); if (clazz.isAnnotationPresent(ClassSubstitution.class)) { - installSubstitution(runtime, target, plan, clazz, pool, clazz.getAnnotation(ClassSubstitution.class).value()); + installSubstitution(runtime, target, clazz, pool, clazz.getAnnotation(ClassSubstitution.class).value()); } else { - installSnippets(runtime, target, plan, clazz, pool); + installSnippets(runtime, target, clazz, pool); } } - private static void installSnippets(GraalRuntime runtime, CiTarget target, PhasePlan plan, Class< ? extends SnippetsInterface> clazz, + private static void installSnippets(GraalRuntime runtime, CiTarget target, Class< ? extends SnippetsInterface> clazz, BoxingMethodPool pool) { for (Method snippet : clazz.getDeclaredMethods()) { int modifiers = snippet.getModifiers(); @@ -62,12 +62,12 @@ } RiResolvedMethod snippetRiMethod = runtime.getRiMethod(snippet); if (snippetRiMethod.compilerStorage().get(Graph.class) == null) { - buildSnippetGraph(snippetRiMethod, runtime, target, pool, plan); + buildSnippetGraph(snippetRiMethod, runtime, target, pool); } } } - private static void installSubstitution(GraalRuntime runtime, CiTarget target, PhasePlan plan, Class< ? extends SnippetsInterface> clazz, + private static void installSubstitution(GraalRuntime runtime, CiTarget target, Class< ? extends SnippetsInterface> clazz, BoxingMethodPool pool, Class original) throws GraalInternalError { for (Method snippet : clazz.getDeclaredMethods()) { try { @@ -80,7 +80,7 @@ throw new RuntimeException("Snippet must not be abstract or native"); } RiResolvedMethod snippetRiMethod = runtime.getRiMethod(snippet); - StructuredGraph graph = buildSnippetGraph(snippetRiMethod, runtime, target, pool, plan); + StructuredGraph graph = buildSnippetGraph(snippetRiMethod, runtime, target, pool); runtime.getRiMethod(method).compilerStorage().put(Graph.class, graph); } catch (NoSuchMethodException e) { throw new RuntimeException("Could not resolve method to substitute with: " + snippet.getName(), e); @@ -88,13 +88,13 @@ } } - private static StructuredGraph buildSnippetGraph(final RiResolvedMethod snippetRiMethod, final GraalRuntime runtime, final CiTarget target, final BoxingMethodPool pool, final PhasePlan plan) { + private static StructuredGraph buildSnippetGraph(final RiResolvedMethod snippetRiMethod, final GraalRuntime runtime, final CiTarget target, final BoxingMethodPool pool) { return Debug.scope("BuildSnippetGraph", snippetRiMethod, new Callable() { @Override public StructuredGraph call() throws Exception { GraphBuilderConfiguration config = GraphBuilderConfiguration.getSnippetDefault(); - GraphBuilderPhase graphBuilder = new GraphBuilderPhase(runtime, config); + GraphBuilderPhase graphBuilder = new GraphBuilderPhase(runtime, config, ProfilingInfoConfiguration.NONE); StructuredGraph graph = new StructuredGraph(snippetRiMethod); graphBuilder.apply(graph); @@ -109,7 +109,7 @@ if (holder.isSubtypeOf(runtime.getType(SnippetsInterface.class))) { StructuredGraph targetGraph = (StructuredGraph) targetMethod.compilerStorage().get(Graph.class); if (targetGraph == null) { - targetGraph = buildSnippetGraph(targetMethod, runtime, target, pool, plan); + targetGraph = buildSnippetGraph(targetMethod, runtime, target, pool); } InliningUtil.inline(invoke, targetGraph, true); if (GraalOptions.OptCanonicalizer) { diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/BoxingEliminationTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/BoxingEliminationTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/BoxingEliminationTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -30,6 +30,7 @@ import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.PhasePosition; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -123,7 +124,8 @@ for (Invoke invoke : graph.getInvokes()) { hints.add(invoke); } - new InliningPhase(null, runtime(), hints, null, phasePlan).apply(graph); + + new InliningPhase(null, runtime(), hints, null, phasePlan, ProfilingInfoConfiguration.ALL).apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); Debug.dump(graph, "Graph"); new BoxingEliminationPhase().apply(graph); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/CompiledMethodTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -30,6 +30,7 @@ import com.oracle.max.cri.ri.*; import com.oracle.max.cri.ri.RiCompiledMethod.MethodInvalidatedException; import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.graph.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; @@ -78,7 +79,7 @@ Method method = CompilableObjectImpl.class.getDeclaredMethod("executeHelper", ObjectCompiler.class, String.class); RiResolvedMethod riMethod = runtime.getRiMethod(method); StructuredGraph graph = new StructuredGraph(riMethod); - new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault()).apply(graph); + new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), ProfilingInfoConfiguration.NONE).apply(graph); new CanonicalizerPhase(null, runtime, null).apply(graph); new DeadCodeEliminationPhase().apply(graph); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/EscapeAnalysisTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/EscapeAnalysisTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/EscapeAnalysisTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -28,6 +28,7 @@ import com.oracle.max.cri.ci.*; import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; @@ -121,10 +122,10 @@ n.node().setProbability(100000); } - new InliningPhase(null, runtime(), null, null, getDefaultPhasePlan()).apply(graph); + new InliningPhase(null, runtime(), null, null, getDefaultPhasePlan(), ProfilingInfoConfiguration.ALL).apply(graph); new DeadCodeEliminationPhase().apply(graph); Debug.dump(graph, "Graph"); - new EscapeAnalysisPhase(null, runtime(), null, getDefaultPhasePlan()).apply(graph); + new EscapeAnalysisPhase(null, runtime(), null, getDefaultPhasePlan(), ProfilingInfoConfiguration.ALL).apply(graph); Debug.dump(graph, "Graph"); int retCount = 0; for (ReturnNode ret : graph.getNodes(ReturnNode.class)) { diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraphTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraphTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/GraphTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -29,6 +29,7 @@ import com.oracle.max.cri.ri.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.cri.*; import com.oracle.graal.debug.*; import com.oracle.graal.java.*; @@ -109,7 +110,7 @@ protected StructuredGraph parse(Method m) { RiResolvedMethod riMethod = runtime.getRiMethod(m); StructuredGraph graph = new StructuredGraph(riMethod); - new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault()).apply(graph); + new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), ProfilingInfoConfiguration.NONE).apply(graph); return graph; } @@ -119,13 +120,13 @@ protected StructuredGraph parseProfiled(Method m) { RiResolvedMethod riMethod = runtime.getRiMethod(m); StructuredGraph graph = new StructuredGraph(riMethod); - new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDefault()).apply(graph); + new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDefault(), ProfilingInfoConfiguration.ALL).apply(graph); return graph; } protected PhasePlan getDefaultPhasePlan() { PhasePlan plan = new PhasePlan(); - plan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault())); + plan.addPhase(PhasePosition.AFTER_PARSING, new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getSnippetDefault(), ProfilingInfoConfiguration.NONE)); return plan; } } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/IfBoxingEliminationTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/IfBoxingEliminationTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/IfBoxingEliminationTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -28,6 +28,7 @@ import com.oracle.graal.compiler.phases.*; import com.oracle.graal.compiler.phases.PhasePlan.PhasePosition; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.debug.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.extended.*; @@ -84,7 +85,7 @@ for (Invoke invoke : graph.getInvokes()) { hints.add(invoke); } - new InliningPhase(null, runtime(), hints, null, phasePlan).apply(graph); + new InliningPhase(null, runtime(), hints, null, phasePlan, ProfilingInfoConfiguration.ALL).apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); new PhiStampPhase().apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeExceptionTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeExceptionTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeExceptionTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -27,6 +27,7 @@ import org.junit.*; import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.nodes.*; public class InvokeExceptionTest extends GraphTest { @@ -62,7 +63,7 @@ for (Invoke invoke : graph.getInvokes()) { hints.add(invoke); } - new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan()).apply(graph); + new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan(), ProfilingInfoConfiguration.ALL).apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); new DeadCodeEliminationPhase().apply(graph); } diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/InvokeTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -29,6 +29,7 @@ import org.junit.*; import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -81,7 +82,7 @@ for (Invoke invoke : graph.getInvokes()) { hints.add(invoke); } - new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan()).apply(graph); + new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan(), ProfilingInfoConfiguration.ALL).apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); new DeadCodeEliminationPhase().apply(graph); StructuredGraph referenceGraph = parse(REFERENCE_SNIPPET); diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/MonitorTest.java --- a/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/MonitorTest.java Tue Mar 13 12:01:24 2012 -0700 +++ b/graal/com.oracle.graal.tests/src/com/oracle/graal/compiler/tests/MonitorTest.java Tue Mar 13 18:53:33 2012 -0700 @@ -32,6 +32,7 @@ import org.junit.Test; import com.oracle.graal.compiler.phases.*; +import com.oracle.graal.compiler.util.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; @@ -93,7 +94,7 @@ for (Invoke invoke : graph.getInvokes()) { hints.add(invoke); } - new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan()).apply(graph); + new InliningPhase(null, runtime(), hints, null, getDefaultPhasePlan(), ProfilingInfoConfiguration.ALL).apply(graph); new CanonicalizerPhase(null, runtime(), null).apply(graph); new DeadCodeEliminationPhase().apply(graph); return graph; diff -r b07ead3a3c2c -r 6766253384bf graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiDeoptReason.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiDeoptReason.java Tue Mar 13 18:53:33 2012 -0700 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, 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.max.cri.ri; + + +public enum RiDeoptReason { + IllegalDeoptReason(0), + Unresolved(1), + UnreachedCode(2), + TypeCheckedInliningViolated(3), + TypeCheckAssumptionViolated(4), + NotCompiledExceptionHandler(5), + JavaSubroutineMismatch(6), + TypeCheckFailed(7), + BoundsCheckFailed(8), + NullCheckFailed(9), + DeoptimizeALot(10); + + private int value; + + private RiDeoptReason(int value) { + this.value = value; + } + + public int value() { + return value; + } +} diff -r b07ead3a3c2c -r 6766253384bf src/cpu/x86/vm/sharedRuntime_x86_64.cpp --- a/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Mar 13 12:01:24 2012 -0700 +++ b/src/cpu/x86/vm/sharedRuntime_x86_64.cpp Tue Mar 13 18:53:33 2012 -0700 @@ -3028,8 +3028,7 @@ assert(r10 == rscratch1, "scratch register should be r10"); __ movl(c_rarg1, Address(rsp, RegisterSaver::r10_offset_in_bytes())); - __ orq(c_rarg1, ~(int32_t)Deoptimization::make_trap_request(Deoptimization::Reason_unreached, Deoptimization::Action_none)); - __ notq(c_rarg1); + __ movl(r14, (int32_t)Deoptimization::Unpack_reexecute); __ mov(c_rarg0, r15_thread); __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, Deoptimization::uncommon_trap))); @@ -3039,7 +3038,7 @@ Label after_fetch_unroll_info_call; __ jmp(after_fetch_unroll_info_call); -#endif +#endif // GRAAL __ bind(cont);