# HG changeset patch # User Thomas Wuerthinger # Date 1422366895 -3600 # Node ID edf3a7fdd0670c8c7d64cfe4601cf731ce398f0c # Parent 14496953435e8401357832fb0674efe8a8ba21cb Add utility methods to GuardsStage. diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Tue Jan 27 14:54:55 2015 +0100 @@ -120,31 +120,31 @@ instanceofSnippets.lower((InstanceOfDynamicNode) n, tool); } } else if (n instanceof NewInstanceNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((NewInstanceNode) n, registers, tool); } } else if (n instanceof DynamicNewInstanceNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((DynamicNewInstanceNode) n, registers, tool); } } else if (n instanceof NewArrayNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((NewArrayNode) n, registers, runtime, tool); } } else if (n instanceof DynamicNewArrayNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((DynamicNewArrayNode) n, registers, tool); } } else if (n instanceof VerifyHeapNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((VerifyHeapNode) n, registers, runtime, tool); } } else if (n instanceof MonitorEnterNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { monitorSnippets.lower((MonitorEnterNode) n, registers, tool); } } else if (n instanceof MonitorExitNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { monitorSnippets.lower((MonitorExitNode) n, tool); } } else if (n instanceof G1PreWriteBarrier) { @@ -162,7 +162,7 @@ } else if (n instanceof G1ArrayRangePostWriteBarrier) { writeBarrierSnippets.lower((G1ArrayRangePostWriteBarrier) n, registers, tool); } else if (n instanceof NewMultiArrayNode) { - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { newObjectSnippets.lower((NewMultiArrayNode) n, tool); } } else if (n instanceof LoadExceptionObjectNode) { @@ -307,7 +307,7 @@ @Override protected void lowerUnsafeLoadNode(UnsafeLoadNode load, LoweringTool tool) { StructuredGraph graph = load.graph(); - if (load.getGuardingCondition() == null && graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal() && addReadBarrier(load)) { + if (load.getGuardingCondition() == null && !graph.getGuardsStage().allowsFloatingGuards() && addReadBarrier(load)) { unsafeLoadSnippets.lower(load, tool); } else { super.lowerUnsafeLoadNode(load, tool); @@ -367,7 +367,7 @@ private void lowerDynamicCounterNode(DynamicCounterNode n) { StructuredGraph graph = n.graph(); - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph.getGuardsStage().areFrameStatesAtDeopts()) { BenchmarkCounters.lower(n, registers, runtime.getConfig(), runtime.getTarget().wordKind); } } @@ -391,7 +391,7 @@ private void lowerBytecodeExceptionNode(BytecodeExceptionNode node) { StructuredGraph graph = node.graph(); - if (graph.getGuardsStage() == StructuredGraph.GuardsStage.FLOATING_GUARDS) { + if (graph.getGuardsStage().allowsFloatingGuards()) { if (OmitHotExceptionStacktrace.getValue()) { Throwable exception; if (node.getExceptionClass() == NullPointerException.class) { diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrier.java Tue Jan 27 14:54:55 2015 +0100 @@ -62,7 +62,7 @@ @Override public void lower(LoweringTool tool) { - assert graph().getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA; + assert graph().getGuardsStage().areFrameStatesAtDeopts(); tool.getLowerer().lower(this, tool); } } diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopyCallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopyCallNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopyCallNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -117,7 +117,7 @@ @Override public void lower(LoweringTool tool) { - if (graph().getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph().getGuardsStage().areFrameStatesAtDeopts()) { updateAlignedDisjoint(); ForeignCallDescriptor desc = HotSpotHostForeignCallsProvider.lookupArraycopyDescriptor(elementKind, isAligned(), isDisjoint(), isUninitialized()); StructuredGraph graph = graph(); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/CheckcastArrayCopyCallNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -99,7 +99,7 @@ @Override public void lower(LoweringTool tool) { - if (graph().getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph().getGuardsStage().areFrameStatesAtDeopts()) { ForeignCallDescriptor desc = HotSpotHostForeignCallsProvider.lookupCheckcastArraycopyDescriptor(isUninit()); StructuredGraph graph = graph(); ValueNode srcAddr = computeBase(getSource(), getSourcePosition()); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/UnsafeArrayCopyNode.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/UnsafeArrayCopyNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/UnsafeArrayCopyNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -95,7 +95,7 @@ @Override public void lower(LoweringTool tool) { - if (graph().getGuardsStage() == StructuredGraph.GuardsStage.AFTER_FSA) { + if (graph().getGuardsStage().areFrameStatesAtDeopts()) { UnsafeArrayCopySnippets.Templates templates = tool.getReplacements().getSnippetTemplateCache(UnsafeArrayCopySnippets.Templates.class); templates.lower(this, tool); } diff -r 14496953435e -r edf3a7fdd067 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 Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -76,7 +76,7 @@ * deoptimizing without invalidating the code. Conditional elimination will eliminate the * guard if it's truly redundant in this case. */ - if (graph().getGuardsStage() == StructuredGraph.GuardsStage.FLOATING_GUARDS && getAction() != DeoptimizationAction.None) { + if (graph().getGuardsStage().allowsFloatingGuards() && getAction() != DeoptimizationAction.None) { ValueNode guard = tool.createGuard(this, condition(), getReason(), getAction(), isNegated()).asNode(); this.replaceAtUsages(guard); ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(guard.asNode())); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/StructuredGraph.java Tue Jan 27 14:54:55 2015 +0100 @@ -65,7 +65,19 @@ * introduced any more. {@link FrameState} nodes are now associated with * {@link DeoptimizingNode} nodes. */ - AFTER_FSA + AFTER_FSA; + + public boolean allowsFloatingGuards() { + return this == FLOATING_GUARDS; + } + + public boolean areFrameStatesAtDeopts() { + return this == AFTER_FSA; + } + + public boolean areFrameStatesAtSideEffects() { + return !this.areFrameStatesAtDeopts(); + } } public static final int INVOCATION_ENTRY_BCI = -1; diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -48,12 +48,12 @@ return stamp; } - public void setStamp(Stamp stamp) { + public final void setStamp(Stamp stamp) { this.stamp = stamp; } @Override - public StructuredGraph graph() { + public final StructuredGraph graph() { return (StructuredGraph) super.graph(); } diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/VirtualState.java Tue Jan 27 14:54:55 2015 +0100 @@ -54,4 +54,9 @@ public abstract boolean isPartOfThisState(VirtualState state); + @Override + public final StructuredGraph graph() { + return (StructuredGraph) super.graph(); + } + } diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -171,7 +171,7 @@ if (singleImplementor != null && !singleImplementor.equals(declaredReceiverType)) { ResolvedJavaMethod singleImplementorMethod = singleImplementor.resolveMethod(targetMethod(), invoke().getContextType(), true); if (singleImplementorMethod != null) { - assert graph().getGuardsStage().ordinal() < StructuredGraph.GuardsStage.FIXED_DEOPTS.ordinal() : "Graph already fixed!"; + assert graph().getGuardsStage().allowsFloatingGuards() : "Graph already fixed!"; /** * We have an invoke on an interface with a single implementor. We can replace this * with an invoke virtual. diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java Tue Jan 27 14:54:55 2015 +0100 @@ -106,8 +106,8 @@ @Override protected void run(StructuredGraph graph) { - assert graph.getGuardsStage().ordinal() >= GuardsStage.FIXED_DEOPTS.ordinal() && checkFixedDeopts(graph); - if (graph.getGuardsStage().ordinal() < GuardsStage.AFTER_FSA.ordinal()) { + assert !graph.getGuardsStage().allowsFloatingGuards() && checkFixedDeopts(graph); + if (graph.getGuardsStage().areFrameStatesAtSideEffects()) { ReentrantNodeIterator.apply(new FrameStateAssignmentClosure(), graph.start(), null); graph.setGuardsStage(GuardsStage.AFTER_FSA); graph.getNodes(FrameState.class).filter(state -> state.hasNoUsages()).forEach(GraphUtil::killWithUnusedFloatingInputs); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Tue Jan 27 14:54:55 2015 +0100 @@ -193,7 +193,7 @@ @Override protected void run(StructuredGraph graph, MidTierContext context) { - if (graph.getGuardsStage().ordinal() < GuardsStage.FIXED_DEOPTS.ordinal()) { + if (graph.getGuardsStage().allowsFloatingGuards()) { SchedulePhase schedule = new SchedulePhase(SchedulingStrategy.EARLIEST); schedule.apply(graph); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Tue Jan 27 14:54:55 2015 +0100 @@ -139,7 +139,7 @@ } } StructuredGraph graph = before.graph(); - if (condition.graph().getGuardsStage().ordinal() >= StructuredGraph.GuardsStage.FIXED_DEOPTS.ordinal()) { + if (!condition.graph().getGuardsStage().allowsFloatingGuards()) { FixedGuardNode fixedGuard = graph.add(new FixedGuardNode(condition, deoptReason, action, negated)); graph.addBeforeFixed(before, fixedGuard); DummyGuardHandle handle = graph.add(new DummyGuardHandle(fixedGuard)); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java Tue Jan 27 14:54:55 2015 +0100 @@ -29,7 +29,6 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.StructuredGraph.GuardsStage; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.util.*; @@ -47,7 +46,7 @@ if (context.getTarget().implicitNullCheckLimit <= 0) { return; } - assert graph.getGuardsStage().ordinal() >= GuardsStage.AFTER_FSA.ordinal(); + assert graph.getGuardsStage().areFrameStatesAtDeopts(); for (DeoptimizeNode deopt : graph.getNodes(DeoptimizeNode.class)) { tryUseTrappingNullCheck(deopt, deopt.predecessor(), deopt.reason(), deopt.getSpeculation()); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Tue Jan 27 14:54:55 2015 +0100 @@ -228,7 +228,7 @@ protected void lowerLoadHubNode(LoadHubNode loadHub) { StructuredGraph graph = loadHub.graph(); - if (graph.getGuardsStage().ordinal() < StructuredGraph.GuardsStage.FIXED_DEOPTS.ordinal()) { + if (graph.getGuardsStage().allowsFloatingGuards()) { return; } ValueNode hub = createReadHub(graph, loadHub.getValue(), loadHub.getGuard()); @@ -270,7 +270,7 @@ ReadNode memoryRead = createUnsafeRead(graph, load, valueAnchorNode); graph.replaceFixedWithFixed(load, valueAnchorNode); graph.addAfterFixed(valueAnchorNode, memoryRead); - } else if (graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal()) { + } else if (!graph.getGuardsStage().allowsFloatingGuards()) { assert load.getKind() != Kind.Illegal; ReadNode memoryRead = createUnsafeRead(graph, load, null); // An unsafe read must not float outside its block otherwise diff -r 14496953435e -r edf3a7fdd067 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 Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java Tue Jan 27 14:54:55 2015 +0100 @@ -675,7 +675,7 @@ GuardsStage guardsStage = args.cacheKey.guardsStage; // Perform lowering on the snippet - if (guardsStage.ordinal() >= GuardsStage.FIXED_DEOPTS.ordinal()) { + if (!guardsStage.allowsFloatingGuards()) { new GuardLoweringPhase().apply(snippetCopy, null); } snippetCopy.setGuardsStage(guardsStage); diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MacroNode.java Tue Jan 27 14:54:55 2015 +0100 @@ -134,9 +134,9 @@ new RemoveValueProxyPhase().apply(replacementGraph); } GuardsStage guardsStage = graph().getGuardsStage(); - if (guardsStage.ordinal() >= GuardsStage.FIXED_DEOPTS.ordinal()) { + if (!guardsStage.allowsFloatingGuards()) { new GuardLoweringPhase().apply(replacementGraph, null); - if (guardsStage.ordinal() >= GuardsStage.AFTER_FSA.ordinal()) { + if (guardsStage.areFrameStatesAtDeopts()) { new FrameStateAssignmentPhase().apply(replacementGraph); } } diff -r 14496953435e -r edf3a7fdd067 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Jan 27 13:17:53 2015 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Tue Jan 27 14:54:55 2015 +0100 @@ -126,6 +126,7 @@ for (FrameState fs : nodeWithState.states()) { FrameState frameState = fs; if (frameState.getUsageCount() > 1) { + // Can happen for example from inlined snippets with multiple state split nodes. FrameState copy = (FrameState) frameState.copyWithInputs(); nodeWithState.asNode().replaceFirstInput(frameState, copy); frameState = copy;