# HG changeset patch # User Thomas Wuerthinger # Date 1381332398 -7200 # Node ID 1fee8d3e99f654c566737cd9ce473a907bfcbd5a # Parent 506d4520435d08f11dbfb86cb9685f7072dac8de# Parent 87402d9a67caafd01317530c9bd8c576d2c444ed Merge. diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed Oct 09 17:26:38 2013 +0200 @@ -647,8 +647,16 @@ checkcastDynamicSnippets.lower(checkcastDynamicNode); } } else if (n instanceof UnsafeLoadNode) { - if (graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal()) { - UnsafeLoadNode load = (UnsafeLoadNode) n; + UnsafeLoadNode load = (UnsafeLoadNode) n; + if (load.getGuardingCondition() != null) { + boolean compressible = (!load.object().isNullConstant() && load.accessKind() == Kind.Object); + ConditionAnchorNode valueAnchorNode = graph.add(new ConditionAnchorNode(load.getGuardingCondition())); + LocationNode location = createLocation(load); + ReadNode memoryRead = graph.add(new ReadNode(load.object(), location, load.stamp(), valueAnchorNode, BarrierType.NONE, compressible)); + load.replaceAtUsages(memoryRead); + graph.replaceFixedWithFixed(load, valueAnchorNode); + graph.addAfterFixed(valueAnchorNode, memoryRead); + } else if (graph.getGuardsStage().ordinal() > StructuredGraph.GuardsStage.FLOATING_GUARDS.ordinal()) { assert load.kind() != Kind.Illegal; boolean compressible = (!load.object().isNullConstant() && load.accessKind() == Kind.Object); if (addReadBarrier(load)) { diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java Wed Oct 09 17:26:38 2013 +0200 @@ -28,7 +28,7 @@ import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; -@NodeInfo(nameTemplate = "ConditionGuard(!={p#negated})") +@NodeInfo(nameTemplate = "ConditionAnchor(!={p#negated})") public final class ConditionAnchorNode extends FixedWithNextNode implements Canonicalizable, Lowerable, GuardingNode { @Input private LogicNode condition; diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Oct 09 17:26:38 2013 +0200 @@ -26,10 +26,10 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; -import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; +import com.oracle.graal.nodes.virtual.*; /** * The {@code ConstantNode} represents a constant such as an integer value, long, float, object @@ -57,15 +57,24 @@ @Override public void generate(LIRGeneratorTool gen) { - if (gen.canInlineConstant(value) || onlyUsedInFrameState()) { + if (gen.canInlineConstant(value) || onlyUsedInVirtualState()) { gen.setResult(this, value); } else { gen.setResult(this, gen.emitMove(value)); } } - private boolean onlyUsedInFrameState() { - return usages().filter(NodePredicates.isNotA(FrameState.class)).isEmpty(); + private boolean onlyUsedInVirtualState() { + for (Node n : this.usages()) { + if (n instanceof FrameState) { + // Only frame state usages. + } else if (n instanceof VirtualState) { + // Only virtual usage. + } else { + return false; + } + } + return true; } public static ConstantNode forConstant(Constant constant, MetaAccessProvider runtime, Graph graph) { diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Wed Oct 09 17:26:38 2013 +0200 @@ -77,8 +77,7 @@ @Override public void virtualize(VirtualizerTool tool) { State state = tool.getObjectState(object); - if (state != null && state.getState() == EscapeState.Virtual) { - assert ObjectStamp.typeOrNull(this).isAssignableFrom(state.getVirtualObject().type()); + if (state != null && state.getState() == EscapeState.Virtual && ObjectStamp.typeOrNull(this).isAssignableFrom(state.getVirtualObject().type())) { tool.replaceWithVirtual(state.getVirtualObject()); } } diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Wed Oct 09 17:26:38 2013 +0200 @@ -35,13 +35,19 @@ * performed before the load. */ public class UnsafeLoadNode extends UnsafeAccessNode implements Lowerable, Virtualizable { + @Input private LogicNode guardingCondition; public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind) { - this(object, offset, accessKind, LocationIdentity.ANY_LOCATION); + this(object, offset, accessKind, LocationIdentity.ANY_LOCATION, null); } - public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity) { + public UnsafeLoadNode(ValueNode object, ValueNode offset, Kind accessKind, LocationIdentity locationIdentity, LogicNode condition) { super(StampFactory.forKind(accessKind.getStackKind()), object, offset, accessKind, locationIdentity); + this.guardingCondition = condition; + } + + public LogicNode getGuardingCondition() { + return guardingCondition; } @Override diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Wed Oct 09 17:26:38 2013 +0200 @@ -523,6 +523,23 @@ } metricCheckCastRemoved.increment(); } + } else if (node instanceof ConditionAnchorNode) { + ConditionAnchorNode conditionAnchorNode = (ConditionAnchorNode) node; + LogicNode condition = conditionAnchorNode.condition(); + ValueNode replacementAnchor = null; + if (conditionAnchorNode.isNegated()) { + if (state.falseConditions.containsKey(condition)) { + replacementAnchor = state.falseConditions.get(condition); + } + } else { + if (state.trueConditions.containsKey(condition)) { + replacementAnchor = state.trueConditions.get(condition); + } + } + if (replacementAnchor != null) { + conditionAnchorNode.replaceAtUsages(replacementAnchor); + conditionAnchorNode.graph().removeFixed(conditionAnchorNode); + } } else if (node instanceof IfNode) { IfNode ifNode = (IfNode) node; LogicNode compare = ifNode.condition(); diff -r 87402d9a67ca -r 1fee8d3e99f6 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java Wed Oct 09 16:02:48 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java Wed Oct 09 17:26:38 2013 +0200 @@ -26,6 +26,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; import com.oracle.graal.truffle.nodes.asserts.*; import com.oracle.truffle.api.*; @@ -46,7 +47,6 @@ assert arguments.size() == ARGUMENT_COUNT; } - @SuppressWarnings("unused") @Override public Node canonical(CanonicalizerTool tool) { ValueNode locationArgument = arguments.get(LOCATION_ARGUMENT_INDEX); @@ -61,7 +61,9 @@ } else { locationIdentity = ObjectLocationIdentity.create(locationIdentityObject); } - return graph().add(new UnsafeLoadNode(objectArgument, offsetArgument, this.stamp().kind(), locationIdentity)); + return graph().add( + new UnsafeLoadNode(objectArgument, offsetArgument, this.stamp().kind(), locationIdentity, CompareNode.createCompareNode(Condition.EQ, conditionArgument, + ConstantNode.forBoolean(true, graph())))); } return this; }