# HG changeset patch # User Thomas Wuerthinger # Date 1309876913 -7200 # Node ID 3e89c4c5f37f9ea41fee2ae92a801fec88cac108 # Parent 906a2e39495b1df82e5b98b88789cd8699a8f8a4 Fixed the frame states in the array copy intrinsification. diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Tue Jul 05 16:41:53 2011 +0200 @@ -580,16 +580,11 @@ } protected FrameState stateBeforeInvokeReturn(Invoke invoke) { - return invoke.stateAfter().duplicateModified(getBeforeInvokeBci(invoke), invoke.stateAfter().rethrowException(), invoke.kind); + return invoke.stateAfter().duplicateModified(invoke.bci, invoke.stateAfter().rethrowException(), invoke.kind); } protected FrameState stateBeforeInvokeWithArguments(Invoke invoke) { - return invoke.stateAfter().duplicateModified(getBeforeInvokeBci(invoke), invoke.stateAfter().rethrowException(), invoke.kind, invoke.arguments().toArray(new Value[0])); - } - - private int getBeforeInvokeBci(Invoke invoke) { - // Cannot calculate BCI, because the invoke can have changed from e.g. invokeinterface to invokespecial because of optimizations. - return invoke.bci; + return invoke.stateAfter().duplicateModified(invoke.bci, invoke.stateAfter().rethrowException(), invoke.kind, invoke.arguments().toArray(new Value[0])); } @Override diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java Tue Jul 05 16:41:53 2011 +0200 @@ -28,7 +28,7 @@ import com.sun.cri.ci.*; -public abstract class AbstractVectorNode extends FixedNodeWithNext { +public abstract class AbstractVectorNode extends StateSplit { private static final int INPUT_COUNT = 1; private static final int INPUT_VECTOR = 0; diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java Tue Jul 05 16:41:53 2011 +0200 @@ -22,7 +22,6 @@ */ package com.oracle.max.graal.compiler.ir; -import com.sun.cri.bytecode.Bytecodes.*; import com.sun.cri.ci.*; import com.sun.cri.ri.*; diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/StateSplit.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/StateSplit.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/StateSplit.java Tue Jul 05 16:41:53 2011 +0200 @@ -56,8 +56,8 @@ return (FrameState) inputs().get(super.inputCount() + INPUT_STATE_AFTER); } - public FrameState setStateAfter(FrameState n) { - return (FrameState) inputs().set(super.inputCount() + INPUT_STATE_AFTER, n); + public void setStateAfter(FrameState n) { + inputs().set(super.inputCount() + INPUT_STATE_AFTER, n); } /** diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Tue Jul 05 16:41:53 2011 +0200 @@ -340,12 +340,6 @@ CompilerGraph graph = null; if (GraalOptions.Intrinsify) { graph = (CompilerGraph) compilation.runtime.intrinsicGraph(method, invoke.arguments()); - if (graph != null && graph.getNodes(Merge.class).iterator().hasNext()) { - WriteMemoryCheckpointNode checkpoint = new WriteMemoryCheckpointNode(invoke.graph()); - checkpoint.setStateAfter(invoke.stateAfter()); - checkpoint.setNext(invoke.next()); - invoke.setNext(checkpoint); - } } if (graph != null) { if (GraalOptions.TraceInlining) { @@ -404,14 +398,25 @@ } else { pred = new Placeholder(compilation.graph); } - invoke.predecessors().get(0).successors().replace(invoke, pred); + invoke.replaceAtPredecessors(pred); replacements.put(startNode, pred); Map duplicates = compilation.graph.addDuplicate(nodes, replacements); + FrameState stateBefore = null; for (Node node : duplicates.values()) { if (node instanceof Invoke) { newInvokes.add((Invoke) node); + } else if (node instanceof FrameState) { + FrameState frameState = (FrameState) node; + if (frameState.bci == FrameState.BEFORE_BCI) { + if (stateBefore == null) { + stateBefore = stateAfter.duplicateModified(invoke.bci, false, invoke.kind, parameters); + } + frameState.replaceAndDelete(stateBefore); + } else if (frameState.bci == FrameState.AFTER_BCI) { + frameState.replaceAndDelete(stateAfter); + } } } diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Tue Jul 05 16:41:53 2011 +0200 @@ -53,6 +53,9 @@ private static final int SUCCESSOR_COUNT = 0; + public static final int BEFORE_BCI = -2; + public static final int AFTER_BCI = -3; + @Override protected int inputCount() { return super.inputCount() + localsSize + stackSize + locksSize; diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Tue Jul 05 16:41:53 2011 +0200 @@ -26,10 +26,9 @@ import java.lang.reflect.*; import java.util.*; -import com.oracle.max.graal.compiler.*; -import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.compiler.ir.*; +import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.oracle.max.graal.runtime.nodes.*; import com.sun.cri.ci.*; @@ -326,6 +325,9 @@ return null; } + FrameState stateBefore = new FrameState(method, FrameState.BEFORE_BCI, 0, 0, 0, false, graph); + FrameState stateAfter = new FrameState(method, FrameState.AFTER_BCI, 0, 0, 0, false, graph); + // Add preconditions. FixedGuard guard = new FixedGuard(graph); ArrayLength srcLength = new ArrayLength(src, graph); @@ -345,11 +347,13 @@ CreateVectorNode normalVector = new CreateVectorNode(false, length, graph); ReadVectorNode values = new ReadVectorNode(new IntegerAddVectorNode(normalVector, srcPos, graph), src, location, graph); new WriteVectorNode(new IntegerAddVectorNode(normalVector, destPos, graph), dest, location, values, graph); + normalVector.setStateAfter(stateAfter); // Build reverse vector instruction. CreateVectorNode reverseVector = new CreateVectorNode(true, length, graph); ReadVectorNode reverseValues = new ReadVectorNode(new IntegerAddVectorNode(reverseVector, srcPos, graph), src, location, graph); new WriteVectorNode(new IntegerAddVectorNode(reverseVector, destPos, graph), dest, location, reverseValues, graph); + reverseVector.setStateAfter(stateAfter); If ifNode = new If(new Compare(src, Condition.EQ, dest, graph), graph); guard.setNext(ifNode); @@ -362,6 +366,7 @@ Merge merge1 = new Merge(graph); merge1.addEnd(new EndNode(graph)); merge1.addEnd(new EndNode(graph)); + merge1.setStateAfter(stateBefore); ifNode.setFalseSuccessor(merge1.endAt(0)); secondIf.setFalseSuccessor(merge1.endAt(1)); @@ -370,6 +375,7 @@ Merge merge2 = new Merge(graph); merge2.addEnd(new EndNode(graph)); merge2.addEnd(new EndNode(graph)); + merge2.setStateAfter(stateAfter); normalVector.setNext(merge2.endAt(0)); reverseVector.setNext(merge2.endAt(1)); diff -r 906a2e39495b -r 3e89c4c5f37f graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java Tue Jul 05 14:12:00 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java Tue Jul 05 16:41:53 2011 +0200 @@ -25,9 +25,7 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.ir.*; -import com.oracle.max.graal.compiler.lir.*; import com.oracle.max.graal.graph.*; -import com.oracle.max.graal.runtime.*; import com.sun.cri.ci.*;