# HG changeset patch # User Thomas Wuerthinger # Date 1425899028 -3600 # Node ID b503dd4e723cd4a5089cd1f1b4974f22df847c45 # Parent 95d0385ec788340ef5ec26862b914b9711754da2 Perform full schedule for conditional elimination only in a phase where floating guards are available. diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest2.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest2.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest2.java Mon Mar 09 12:03:48 2015 +0100 @@ -99,7 +99,7 @@ new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context); canonicalizer.apply(graph, context); new FloatingReadPhase().apply(graph); - new DominatorConditionalEliminationPhase().apply(graph, context); + new DominatorConditionalEliminationPhase(true).apply(graph, context); canonicalizer.apply(graph, context); assertDeepEquals(1, graph.getNodes().filter(GuardNode.class).count()); @@ -121,7 +121,7 @@ new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context); canonicalizer.apply(graph, context); - new DominatorConditionalEliminationPhase().apply(graph, context); + new DominatorConditionalEliminationPhase(true).apply(graph, context); canonicalizer.apply(graph, context); assertDeepEquals(0, graph.getNodes().filter(GuardNode.class).count()); diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTestBase.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTestBase.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTestBase.java Mon Mar 09 12:03:48 2015 +0100 @@ -48,7 +48,7 @@ canonicalizer1.apply(graph, context); new ConvertDeoptimizeToGuardPhase().apply(graph, context); CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); - new DominatorConditionalEliminationPhase().apply(graph, context); + new DominatorConditionalEliminationPhase(true).apply(graph, context); canonicalizer.apply(graph, context); canonicalizer.apply(graph, context); StructuredGraph referenceGraph = parseEager(referenceSnippet, AllowAssumptions.YES); @@ -67,7 +67,7 @@ canonicalizer.apply(graph, context); int baseProxyCount = graph.getNodes().filter(ProxyNode.class).count(); - new DominatorConditionalEliminationPhase().apply(graph, context); + new DominatorConditionalEliminationPhase(true).apply(graph, context); canonicalizer.apply(graph, context); new SchedulePhase().apply(graph, context); int actualProxiesCreated = graph.getNodes().filter(ProxyNode.class).count() - baseProxyCount; diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/HighTier.java Mon Mar 09 12:03:48 2015 +0100 @@ -64,7 +64,7 @@ if (ConditionalElimination.getValue() && OptCanonicalizer.getValue()) { appendPhase(canonicalizer); - appendPhase(new IterativeConditionalEliminationPhase(canonicalizer)); + appendPhase(new IterativeConditionalEliminationPhase(canonicalizer, false)); } } } diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LowTier.java Mon Mar 09 12:03:48 2015 +0100 @@ -60,7 +60,7 @@ /* Cleanup IsNull checks resulting from MID_TIER/LOW_TIER lowering and ExpandLogic phase. */ if (ConditionalElimination.getValue() && OptCanonicalizer.getValue()) { - appendPhase(new IterativeConditionalEliminationPhase(canonicalizer)); + appendPhase(new IterativeConditionalEliminationPhase(canonicalizer, false)); /* Canonicalizer may create some new ShortCircuitOrNodes so clean them up. */ appendPhase(new ExpandLogicPhase()); } diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/MidTier.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/MidTier.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/MidTier.java Mon Mar 09 12:03:48 2015 +0100 @@ -67,7 +67,7 @@ } if (ConditionalElimination.getValue() && OptCanonicalizer.getValue()) { - appendPhase(new IterativeConditionalEliminationPhase(canonicalizer)); + appendPhase(new IterativeConditionalEliminationPhase(canonicalizer, false)); } if (OptEliminatePartiallyRedundantGuards.getValue()) { diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/cfg/Block.java Mon Mar 09 12:03:48 2015 +0100 @@ -124,10 +124,15 @@ @Override public FixedNode next() { FixedNode result = cur; - if (cur == getEndNode()) { + if (result instanceof FixedWithNextNode) { + FixedWithNextNode fixedWithNextNode = (FixedWithNextNode) result; + FixedNode next = fixedWithNextNode.next(); + if (next instanceof AbstractBeginNode) { + next = null; + } + cur = next; + } else { cur = null; - } else { - cur = ((FixedWithNextNode) cur).next(); } assert !(cur instanceof AbstractBeginNode); return result; diff -r 95d0385ec788 -r b503dd4e723c 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 Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Mon Mar 09 12:03:48 2015 +0100 @@ -44,8 +44,10 @@ private static final DebugMetric metricStampsRegistered = Debug.metric("StampsRegistered"); private static final DebugMetric metricStampsFound = Debug.metric("StampsFound"); + private final boolean fullSchedule; - public DominatorConditionalEliminationPhase() { + public DominatorConditionalEliminationPhase(boolean fullSchedule) { + this.fullSchedule = fullSchedule; } private static final class InfoElement { @@ -88,12 +90,29 @@ @Override protected void run(StructuredGraph graph) { - SchedulePhase schedule = new SchedulePhase(SchedulePhase.SchedulingStrategy.EARLIEST); - schedule.apply(graph); - ControlFlowGraph cfg = schedule.getCFG(); - cfg.computePostdominators(); - Instance instance = new Instance(graph, b -> schedule.getBlockToNodesMap().get(b), n -> schedule.getNodeToBlockMap().get(n)); - instance.processBlock(cfg.getStartBlock()); + + Function> blockToNodes; + Function nodeToBlock; + Block startBlock; + + if (fullSchedule) { + SchedulePhase schedule = new SchedulePhase(SchedulePhase.SchedulingStrategy.EARLIEST); + schedule.apply(graph); + ControlFlowGraph cfg = schedule.getCFG(); + cfg.computePostdominators(); + blockToNodes = b -> schedule.getBlockToNodesMap().get(b); + nodeToBlock = n -> schedule.getNodeToBlockMap().get(n); + startBlock = cfg.getStartBlock(); + } else { + ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, false, true, true); + cfg.computePostdominators(); + blockToNodes = b -> b.getNodes(); + nodeToBlock = n -> cfg.blockFor(n); + startBlock = cfg.getStartBlock(); + } + + Instance instance = new Instance(graph, blockToNodes, nodeToBlock); + instance.processBlock(startBlock); } private static class Instance { diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Mon Mar 09 12:03:48 2015 +0100 @@ -38,9 +38,11 @@ private static final int MAX_ITERATIONS = 256; private final CanonicalizerPhase canonicalizer; + private final boolean fullSchedule; - public IterativeConditionalEliminationPhase(CanonicalizerPhase canonicalizer) { + public IterativeConditionalEliminationPhase(CanonicalizerPhase canonicalizer, boolean fullSchedule) { this.canonicalizer = canonicalizer; + this.fullSchedule = fullSchedule; } @Override @@ -49,7 +51,7 @@ int count = 0; while (true) { try (NodeEventScope nes = graph.trackNodeEvents(listener)) { - new DominatorConditionalEliminationPhase().apply(graph); + new DominatorConditionalEliminationPhase(fullSchedule).apply(graph); } if (listener.getNodes().isEmpty()) { break; diff -r 95d0385ec788 -r b503dd4e723c graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Mon Mar 09 11:33:09 2015 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/IterativeInliningPhase.java Mon Mar 09 12:03:48 2015 +0100 @@ -74,7 +74,7 @@ if (ConditionalElimination.getValue() && OptCanonicalizer.getValue()) { canonicalizer.apply(graph, context); - new IterativeConditionalEliminationPhase(canonicalizer).apply(graph, context); + new IterativeConditionalEliminationPhase(canonicalizer, false).apply(graph, context); } if (!progress) { break;