# HG changeset patch # User Lukas Stadler # Date 1426094185 -3600 # Node ID 905afef74a2ecdd1cc34635458f2a402183b3000 # Parent 5e74068c9150aa3ac98aece320ae6033f0c95e79 make sure that all split successors guard for a condition before optimizing in OptimizeGuardAnchorsPhase diff -r 5e74068c9150 -r 905afef74a2e graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/OptimizeGuardAnchorsPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/OptimizeGuardAnchorsPhase.java Wed Mar 11 16:35:26 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/OptimizeGuardAnchorsPhase.java Wed Mar 11 18:16:25 2015 +0100 @@ -94,21 +94,26 @@ private static void optimizeAtControlSplit(ControlSplitNode controlSplit, LazyCFG cfg) { AbstractBeginNode successor = findMinimumUsagesSuccessor(controlSplit); int successorCount = controlSplit.successors().count(); - List otherGuards = new ArrayList<>(successorCount - 1); for (GuardNode guard : successor.guards().snapshot()) { if (guard.isDeleted() || guard.condition().getUsageCount() < successorCount) { continue; } + List otherGuards = new ArrayList<>(successorCount - 1); + HashSet successorsWithoutGuards = new HashSet<>(controlSplit.successors().count()); + controlSplit.successors().snapshotTo(successorsWithoutGuards); + successorsWithoutGuards.remove(guard.getAnchor()); for (GuardNode conditonGuard : guard.condition().usages().filter(GuardNode.class)) { if (conditonGuard != guard) { - AnchoringNode conditonGuardAnchor = conditonGuard.getAnchor(); - if (conditonGuardAnchor.asNode().predecessor() == controlSplit && compatibleGuards(guard, conditonGuard)) { + AnchoringNode conditionGuardAnchor = conditonGuard.getAnchor(); + if (conditionGuardAnchor.asNode().predecessor() == controlSplit && compatibleGuards(guard, conditonGuard)) { otherGuards.add(conditonGuard); + successorsWithoutGuards.remove(conditionGuardAnchor); } } } - if (otherGuards.size() == successorCount - 1) { + if (successorsWithoutGuards.isEmpty()) { + assert otherGuards.size() >= successorCount - 1; AbstractBeginNode anchor = computeOptimalAnchor(cfg.get(), AbstractBeginNode.prevBegin(controlSplit)); GuardNode newGuard = controlSplit.graph().unique(new GuardNode(guard.condition(), anchor, guard.reason(), guard.action(), guard.isNegated(), guard.getSpeculation())); for (GuardNode otherGuard : otherGuards) {