# HG changeset patch # User Doug Simon # Date 1427902802 -7200 # Node ID b9f65c441427881d066d816e15791dc7926a9b2f # Parent 5f533a5c2aaf139e6b0d89a0d1ce1d06a75b2869 allow lowering of UnsafeLoadNode while guards are still floating diff -r 5f533a5c2aaf -r b9f65c441427 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Apr 01 17:36:51 2015 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FloatingReadPhase.java Wed Apr 01 17:40:02 2015 +0200 @@ -327,9 +327,9 @@ private static void processFloatable(FloatableAccessNode accessNode, MemoryMapImpl state) { StructuredGraph graph = accessNode.graph(); - assert accessNode.getNullCheck() == false; LocationIdentity locationIdentity = accessNode.location().getLocationIdentity(); if (accessNode.canFloat()) { + assert accessNode.getNullCheck() == false; MemoryNode lastLocationAccess = state.getLastLocationAccess(locationIdentity); FloatingAccessNode floatingNode = accessNode.asFloatingNode(lastLocationAccess); ValueAnchorNode anchor = null; diff -r 5f533a5c2aaf -r b9f65c441427 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 Wed Apr 01 17:36:51 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultJavaLoweringProvider.java Wed Apr 01 17:40:02 2015 +0200 @@ -271,12 +271,12 @@ ReadNode memoryRead = createUnsafeRead(graph, load, valueAnchorNode); graph.replaceFixedWithFixed(load, valueAnchorNode); graph.addAfterFixed(valueAnchorNode, memoryRead); - } else if (!graph.getGuardsStage().allowsFloatingGuards()) { + } else { assert load.getKind() != Kind.Illegal; - ReadNode memoryRead = createUnsafeRead(graph, load, null); // An unsafe read must not float outside its block otherwise // it may float above an explicit null check on its object. - memoryRead.setGuard(AbstractBeginNode.prevBegin(load)); + AbstractBeginNode guard = AbstractBeginNode.prevBegin(load); + ReadNode memoryRead = createUnsafeRead(graph, load, guard); graph.replaceFixedWithFixed(load, memoryRead); } }