changeset 10667:5348b49b2a76

Assign framestates in snippet lowering after framestate assignment.
author Roland Schatz <roland.schatz@oracle.com>
date Tue, 09 Jul 2013 11:57:18 +0200
parents 9808158cfeab
children 110444cbf1eb
files graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java
diffstat 1 files changed, 25 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Tue Jul 09 11:14:36 2013 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Tue Jul 09 11:57:18 2013 +0200
@@ -488,6 +488,7 @@
         // Remove all frame states from inlined snippet graph. Snippets must be atomic (i.e. free
         // of side-effects that prevent deoptimizing to a point before the snippet).
         ArrayList<StateSplit> curSideEffectNodes = new ArrayList<>();
+        ArrayList<DeoptimizingNode> curDeoptNodes = new ArrayList<>();
         ArrayList<ValueNode> curStampNodes = new ArrayList<>();
         for (Node node : snippetCopy.getNodes()) {
             if (node instanceof ValueNode && ((ValueNode) node).stamp() == StampFactory.forNodeIntrinsic()) {
@@ -503,6 +504,12 @@
                     stateSplit.setStateAfter(null);
                 }
             }
+            if (node instanceof DeoptimizingNode) {
+                DeoptimizingNode deoptNode = (DeoptimizingNode) node;
+                if (deoptNode.canDeoptimize()) {
+                    curDeoptNodes.add(deoptNode);
+                }
+            }
         }
 
         new DeadCodeEliminationPhase().apply(snippetCopy);
@@ -528,6 +535,7 @@
         }
 
         this.sideEffectNodes = curSideEffectNodes;
+        this.deoptNodes = curDeoptNodes;
         this.stampNodes = curStampNodes;
         this.returnNode = retNode;
     }
@@ -589,6 +597,12 @@
     private final ArrayList<StateSplit> sideEffectNodes;
 
     /**
+     * Nodes that inherit the {@link DeoptimizingNode#getDeoptimizationState()} from the replacee
+     * during insantiation.
+     */
+    private final ArrayList<DeoptimizingNode> deoptNodes;
+
+    /**
      * The nodes that inherit the {@link ValueNode#stamp()} from the replacee during instantiation.
      */
     private final ArrayList<ValueNode> stampNodes;
@@ -743,6 +757,17 @@
                 ((StateSplit) sideEffectDup).setStateAfter(((StateSplit) replacee).stateAfter());
             }
         }
+
+        if (replacee instanceof DeoptimizingNode) {
+            DeoptimizingNode replaceeDeopt = (DeoptimizingNode) replacee;
+            FrameState state = replaceeDeopt.getDeoptimizationState();
+            for (DeoptimizingNode deoptNode : deoptNodes) {
+                DeoptimizingNode deoptDup = (DeoptimizingNode) duplicates.get(deoptNode);
+                assert replaceeDeopt.canDeoptimize() || !deoptDup.canDeoptimize();
+                deoptDup.setDeoptimizationState(state);
+            }
+        }
+
         for (ValueNode stampNode : stampNodes) {
             Node stampDup = duplicates.get(stampNode);
             ((ValueNode) stampDup).setStamp(((ValueNode) replacee).stamp());