# HG changeset patch # User Lukas Stadler # Date 1390562765 -3600 # Node ID a03cb658e68e863f8dd02ea30adfbc27ff856a92 # Parent 962f06a1a387337a2d1c4e9dbf6dc17c74a1f38c only register ShortCircuitOrNodes in ConditionalElimination for fixed anchors diff -r 962f06a1a387 -r a03cb658e68e graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Fri Jan 24 01:19:52 2014 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java Fri Jan 24 12:26:05 2014 +0100 @@ -109,11 +109,6 @@ if (c.getValue() != negated) { return graph().start(); } - } else if (negated && condition() instanceof ShortCircuitOrNode) { - ShortCircuitOrNode or = (ShortCircuitOrNode) condition(); - GuardNode firstGuard = graph().unique(new GuardNode(or.getX(), getGuard(), reason, action, !or.isXNegated(), speculation)); - GuardNode secondGuard = graph().unique(new GuardNode(or.getY(), firstGuard, reason, action, !or.isYNegated(), speculation)); - return secondGuard; } return this; } diff -r 962f06a1a387 -r a03cb658e68e graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Fri Jan 24 01:19:52 2014 +0000 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Fri Jan 24 12:26:05 2014 +0100 @@ -315,9 +315,18 @@ private void registerCondition(boolean isTrue, LogicNode condition, ValueNode anchor) { if (!isTrue && condition instanceof ShortCircuitOrNode) { - ShortCircuitOrNode disjunction = (ShortCircuitOrNode) condition; - registerCondition(disjunction.isXNegated(), disjunction.getX(), anchor); - registerCondition(disjunction.isYNegated(), disjunction.getY(), anchor); + /* + * We can only do this for fixed nodes, because floating guards will be registered + * at a BeginNode but might be "valid" only later due to data flow dependencies. + * Therefore, registering both conditions of a ShortCircuitOrNode for a floating + * guard could lead to cycles in data flow, because the guard will be used as anchor + * for both conditions, and one condition could be depending on the other. + */ + if (anchor instanceof FixedNode) { + ShortCircuitOrNode disjunction = (ShortCircuitOrNode) condition; + registerCondition(disjunction.isXNegated(), disjunction.getX(), anchor); + registerCondition(disjunction.isYNegated(), disjunction.getY(), anchor); + } } state.addCondition(isTrue, condition, anchor);