Mercurial > hg > truffle
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; }