Mercurial > hg > graal-jvmci-8
changeset 19791:905afef74a2e
make sure that all split successors guard for a condition before optimizing in OptimizeGuardAnchorsPhase
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 11 Mar 2015 18:16:25 +0100 |
parents | 5e74068c9150 |
children | 90f0e7566dc0 |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/OptimizeGuardAnchorsPhase.java |
diffstat | 1 files changed, 9 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- 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<GuardNode> otherGuards = new ArrayList<>(successorCount - 1); for (GuardNode guard : successor.guards().snapshot()) { if (guard.isDeleted() || guard.condition().getUsageCount() < successorCount) { continue; } + List<GuardNode> otherGuards = new ArrayList<>(successorCount - 1); + HashSet<Node> 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) {