src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java	Fri Jul  7 09:31:28 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java	Fri Jul  7 09:31:28 2017

*** 33,45 **** --- 33,45 ---- import org.graalvm.compiler.core.common.type.ArithmeticOpTable.BinaryOp.Or; import org.graalvm.compiler.core.common.type.IntegerStamp; import org.graalvm.compiler.core.common.type.ObjectStamp; import org.graalvm.compiler.core.common.type.Stamp; import org.graalvm.compiler.core.common.type.StampFactory; ! import org.graalvm.compiler.debug.Debug; ! import org.graalvm.compiler.debug.CounterKey; import org.graalvm.compiler.debug.DebugCloseable; ! import org.graalvm.compiler.debug.DebugCounter; ! import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeMap; import org.graalvm.compiler.graph.NodeStack; import org.graalvm.compiler.graph.spi.CanonicalizerTool; import org.graalvm.compiler.nodeinfo.InputType;
*** 61,74 **** --- 61,74 ---- import org.graalvm.compiler.nodes.ParameterNode; import org.graalvm.compiler.nodes.PiNode; import org.graalvm.compiler.nodes.ProxyNode; import org.graalvm.compiler.nodes.ShortCircuitOrNode; import org.graalvm.compiler.nodes.StructuredGraph; + import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult; import org.graalvm.compiler.nodes.UnaryOpLogicNode; import org.graalvm.compiler.nodes.ValueNode; import org.graalvm.compiler.nodes.ValuePhiNode; import org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult; import org.graalvm.compiler.nodes.calc.AndNode; import org.graalvm.compiler.nodes.calc.BinaryArithmeticNode; import org.graalvm.compiler.nodes.calc.BinaryNode; import org.graalvm.compiler.nodes.calc.IntegerEqualsNode; import org.graalvm.compiler.nodes.calc.UnaryNode;
*** 94,107 **** --- 94,107 ---- import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.TriState; public class ConditionalEliminationPhase extends BasePhase<PhaseContext> { ! private static final DebugCounter counterStampsRegistered = Debug.counter("StampsRegistered"); ! private static final DebugCounter counterStampsFound = Debug.counter("StampsFound"); ! private static final DebugCounter counterIfsKilled = Debug.counter("CE_KilledIfs"); ! private static final DebugCounter counterPhiStampsImproved = Debug.counter("CE_ImprovedPhis"); ! private static final CounterKey counterStampsRegistered = DebugContext.counter("StampsRegistered"); ! private static final CounterKey counterStampsFound = DebugContext.counter("StampsFound"); ! private static final CounterKey counterIfsKilled = DebugContext.counter("CE_KilledIfs"); ! private static final CounterKey counterPhiStampsImproved = DebugContext.counter("CE_ImprovedPhis"); private final boolean fullSchedule; private final boolean moveGuards; public ConditionalEliminationPhase(boolean fullSchedule) { this(fullSchedule, true);
*** 113,123 **** --- 113,123 ---- } @Override @SuppressWarnings("try") protected void run(StructuredGraph graph, PhaseContext context) { ! try (Debug.Scope s = Debug.scope("DominatorConditionalElimination")) { ! try (DebugContext.Scope s = graph.getDebug().scope("DominatorConditionalElimination")) { BlockMap<List<Node>> blockToNodes = null; NodeMap<Block> nodeToBlock = null; ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true); if (fullSchedule) { if (moveGuards) {
*** 240,258 **** --- 240,260 ---- protected final NodeMap<InfoElement> map; protected final BlockMap<List<Node>> blockToNodes; protected final CanonicalizerTool tool; protected final NodeStack undoOperations; protected final StructuredGraph graph; + protected final DebugContext debug; protected final EconomicMap<MergeNode, EconomicMap<ValuePhiNode, PhiInfoElement>> mergeMaps; /** * Tests which may be eliminated because post dominating tests to prove a broader condition. */ private Deque<PendingTest> pendingTests; public Instance(StructuredGraph graph, BlockMap<List<Node>> blockToNodes, PhaseContext context) { this.graph = graph; + this.debug = graph.getDebug(); this.blockToNodes = blockToNodes; this.undoOperations = new NodeStack(); this.map = graph.createNodeMap(); pendingTests = new ArrayDeque<>(); tool = GraphUtil.getDefaultSimplifier(context.getMetaAccess(), context.getConstantReflection(), context.getConstantFieldProvider(), false, graph.getAssumptions(), graph.getOptions(),
*** 302,312 **** --- 304,314 ---- DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(node.getAction(), node.getReason(), node.getSpeculation())); deopt.setStateBefore(node.stateBefore()); node.replaceAtPredecessor(deopt); GraphUtil.killCFG(node); } ! Debug.log("Kill fixed guard guard"); ! debug.log("Kill fixed guard guard"); return true; })) { registerNewCondition(node.condition(), node.isNegated(), node); } }
*** 316,334 **** --- 318,336 ---- AbstractBeginNode survivingSuccessor = node.getSuccessor(result); survivingSuccessor.replaceAtUsages(InputType.Guard, guard.asNode()); survivingSuccessor.replaceAtPredecessor(null); node.replaceAtPredecessor(survivingSuccessor); GraphUtil.killCFG(node); ! counterIfsKilled.increment(debug); return true; }); } @Override public Integer enter(Block block) { int mark = undoOperations.size(); ! Debug.log("[Pre Processing block %s]", block); ! debug.log("[Pre Processing block %s]", block); // For now conservatively collect guards only within the same block. pendingTests.clear(); processNodes(block); return mark; }
*** 346,356 **** --- 348,358 ---- } private void processBlock(Block block) { FixedNode n = block.getBeginNode(); FixedNode endNode = block.getEndNode(); ! Debug.log("[Processing block %s]", block); ! debug.log("[Processing block %s]", block); while (n != endNode) { if (n.isDeleted() || endNode.isDeleted()) { // This branch was deleted! return; }
*** 471,481 **** --- 473,483 ---- ValueNode valueNode = graph.maybeAddOrUnique(PiNode.create(input, curBestStamp, (ValueNode) infoElement.guard)); valueAt = valueNode; } newPhi.addInput(valueAt); } ! counterPhiStampsImproved.increment(debug); phi.replaceAtUsagesAndDelete(newPhi); } } } }
*** 695,705 **** --- 697,707 ---- } return map.getAndGrow(value); } protected boolean rewireGuards(GuardingNode guard, boolean result, ValueNode proxifiedInput, Stamp guardedValueStamp, GuardRewirer rewireGuardFunction) { ! counterStampsFound.increment(debug); return rewireGuardFunction.rewire(guard, result, guardedValueStamp, proxifiedInput); } protected boolean tryProveCondition(LogicNode node, GuardRewirer rewireGuardFunction) { return tryProveGuardCondition(null, node, rewireGuardFunction);
*** 891,902 **** --- 893,904 ---- ValueNode proxiedValue = null; if (value instanceof PiNode) { proxiedValue = value; } do { ! counterStampsRegistered.increment(debug); ! Debug.log("\t Saving stamp for node %s stamp %s guarded by %s", value, stamp, guard); ! debug.log("\t Saving stamp for node %s stamp %s guarded by %s", value, stamp, guard); assert value instanceof LogicNode || stamp.isCompatible(value.stamp()) : stamp + " vs. " + value.stamp() + " (" + value + ")"; map.setAndGrow(value, new InfoElement(stamp, guard, proxiedValue, map.getAndGrow(value))); undoOperations.push(value); if (value instanceof StampInverter) { StampInverter stampInverter = (StampInverter) value;

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/ConditionalEliminationPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File