changeset 16098:1c042d5e7e69

make sure that anchoredReceiver isn't deleted when tail duplicating during inlining
author Lukas Stadler <lukas.stadler@oracle.com>
date Fri, 13 Jun 2014 18:18:09 +0200
parents 4af6f1fe425c
children 0d1f79e8add9
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java
diffstat 1 files changed, 9 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Fri Jun 13 18:17:31 2014 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/info/MultiTypeGuardInlineInfo.java	Fri Jun 13 18:18:09 2014 +0200
@@ -222,9 +222,7 @@
 
         ArrayList<GuardedValueNode> replacementNodes = new ArrayList<>();
 
-        Collection<Node> parameterUsages = new ArrayList<>();
-
-        // do the actual inlining for every invoke
+        // prepare the anchors for the invokes
         for (int i = 0; i < numberOfMethods; i++) {
             BeginNode node = successors[i];
             Invoke invokeForInlining = (Invoke) node.next();
@@ -241,8 +239,7 @@
             GuardedValueNode anchoredReceiver = InliningUtil.createAnchoredReceiver(graph, node, commonType, receiver, exact);
             invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver);
 
-            parameterUsages.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false));
-
+            assert !anchoredReceiver.isDeleted() : anchoredReceiver;
             replacementNodes.add(anchoredReceiver);
         }
         if (shouldFallbackToInvoke()) {
@@ -274,6 +271,13 @@
                 TailDuplicationPhase.tailDuplicate(returnMerge, TailDuplicationPhase.TRUE_DECISION, replacementNodes, phaseContext, canonicalizer);
             }
         }
+
+        Collection<Node> parameterUsages = new ArrayList<>();
+        // do the actual inlining for every invoke
+        for (int i = 0; i < numberOfMethods; i++) {
+            Invoke invokeForInlining = (Invoke) successors[i].next();
+            parameterUsages.addAll(inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false));
+        }
         return parameterUsages;
     }