# HG changeset patch # User Roland Schatz # Date 1373363838 -7200 # Node ID 5348b49b2a76ff03bb7637ef7c07e7630cfff724 # Parent 9808158cfeab3f4e9377573123d8fda9adb097d8 Assign framestates in snippet lowering after framestate assignment. diff -r 9808158cfeab -r 5348b49b2a76 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java --- 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 curSideEffectNodes = new ArrayList<>(); + ArrayList curDeoptNodes = new ArrayList<>(); ArrayList 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 sideEffectNodes; /** + * Nodes that inherit the {@link DeoptimizingNode#getDeoptimizationState()} from the replacee + * during insantiation. + */ + private final ArrayList deoptNodes; + + /** * The nodes that inherit the {@link ValueNode#stamp()} from the replacee during instantiation. */ private final ArrayList 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());