# HG changeset patch # User Gilles Duboscq # Date 1445349340 -7200 # Node ID ad106dd2000ccb8edaabfee12800fe9b60325e5f # Parent 09d5bba0743e63f704c6bbb59b0f60421adbdb81 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. diff -r 09d5bba0743e -r ad106dd2000c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/AbstractFixedGuardNode.java --- 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; diff -r 09d5bba0743e -r ad106dd2000c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConvertDeoptimizeToGuardPhase.java --- 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); diff -r 09d5bba0743e -r ad106dd2000c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java --- 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);