Mercurial > hg > graal-compiler
changeset 22872:ad106dd2000c
Fix missing transfer of speculation when recreating guards/deops
All fields need to be transfered (reason, action and speculation).
When we drop the speculation object we risk infinite deopts.
author | Gilles Duboscq <gilles.m.duboscq@oracle.com> |
---|---|
date | Tue, 20 Oct 2015 15:55:40 +0200 |
parents | 09d5bba0743e |
children | 3566ad79cf86 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java |
diffstat | 3 files changed, 3 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java Tue Oct 20 15:44:10 2015 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java Tue Oct 20 15:55:40 2015 +0200 @@ -102,7 +102,7 @@ public DeoptimizeNode lowerToIf() { FixedNode currentNext = next(); setNext(null); - DeoptimizeNode deopt = graph().add(new DeoptimizeNode(action, reason)); + DeoptimizeNode deopt = graph().add(new DeoptimizeNode(action, reason, speculation)); deopt.setStateBefore(stateBefore()); IfNode ifNode; AbstractBeginNode noDeoptSuccessor;
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Tue Oct 20 15:44:10 2015 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java Tue Oct 20 15:55:40 2015 +0200 @@ -201,7 +201,7 @@ FixedNode next = deoptPred.next(); if (!(next instanceof DeoptimizeNode)) { - DeoptimizeNode newDeoptNode = graph.add(new DeoptimizeNode(deoptAction, deoptReason)); + DeoptimizeNode newDeoptNode = graph.add(new DeoptimizeNode(deoptAction, deoptReason, speculation)); deoptPred.setNext(newDeoptNode); assert deoptPred == newDeoptNode.predecessor(); GraphUtil.killCFG(next);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Tue Oct 20 15:44:10 2015 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Tue Oct 20 15:55:40 2015 +0200 @@ -472,7 +472,7 @@ if (result != node.isNegated()) { node.replaceAndDelete(guard); } else { - DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(node.action(), node.reason())); + DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(node.action(), node.reason(), node.getSpeculation())); AbstractBeginNode beginNode = (AbstractBeginNode) node.getAnchor(); FixedNode next = beginNode.next(); beginNode.setNext(deopt);