changeset 3152:3e89c4c5f37f

Fixed the frame states in the array copy intrinsification.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Tue, 05 Jul 2011 16:41:53 +0200
parents 906a2e39495b
children 5ca1332171c8
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/StateSplit.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java
diffstat 8 files changed, 28 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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;
--- 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.*;
 
--- 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);
     }
 
     /**
--- 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<Node, Node> 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);
+                }
             }
         }
 
--- 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;
--- 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));
--- 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.*;