Mercurial > hg > truffle
changeset 19714:b503dd4e723c
Perform full schedule for conditional elimination only in a phase where floating guards are available.
line wrap: on
line diff
--- 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());
--- 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;
--- 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)); } } }
--- 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()); }
--- 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()) {
--- 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;
--- 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<Block, Iterable<? extends Node>> blockToNodes; + Function<Node, Block> 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 {
--- 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;
--- 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;