# HG changeset patch # User Thomas Wuerthinger # Date 1381266893 -7200 # Node ID 0fa39f034839d72ce4c0191e678af384c36ed3f8 # Parent e8a70ba77439d1532b71eb8901e6e226a5fd03f2 Allow floating unsafe loads. diff -r e8a70ba77439 -r 0fa39f034839 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 Tue Oct 08 23:14:35 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Oct 08 23:14:53 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 e8a70ba77439 -r 0fa39f034839 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 Tue Oct 08 23:14:35 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConditionAnchorNode.java Tue Oct 08 23:14:53 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 e8a70ba77439 -r 0fa39f034839 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 Tue Oct 08 23:14:35 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeLoadNode.java Tue Oct 08 23:14:53 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 e8a70ba77439 -r 0fa39f034839 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 Tue Oct 08 23:14:35 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Tue Oct 08 23:14:53 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 e8a70ba77439 -r 0fa39f034839 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 Tue Oct 08 23:14:35 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadMacroNode.java Tue Oct 08 23:14:53 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; }