src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.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.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java	Fri Jul  7 09:29:25 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/alloc/BiDirectionalTraceBuilder.java	Fri Jul  7 09:29:25 2017

*** 29,49 **** --- 29,49 ---- import java.util.Collection; import java.util.Deque; import org.graalvm.compiler.core.common.alloc.TraceBuilderResult.TrivialTracePredicate; import org.graalvm.compiler.core.common.cfg.AbstractBlockBase; ! import org.graalvm.compiler.debug.DebugContext; import org.graalvm.compiler.debug.Indent; /** * Computes traces by selecting the unhandled block with the highest execution frequency and going * in both directions, up and down, as long as possible. */ public final class BiDirectionalTraceBuilder { ! public static TraceBuilderResult computeTraces(DebugContext debug, AbstractBlockBase<?> startBlock, AbstractBlockBase<?>[] blocks, TrivialTracePredicate pred) { ! return new BiDirectionalTraceBuilder(blocks).build(startBlock, blocks, pred); ! return new BiDirectionalTraceBuilder(blocks).build(debug, startBlock, blocks, pred); } private final Deque<AbstractBlockBase<?>> worklist; private final BitSet processed; private final Trace[] blockToTrace;
*** 67,92 **** --- 67,92 ---- private boolean processed(AbstractBlockBase<?> b) { return processed.get(b.getId()); } @SuppressWarnings("try") ! private TraceBuilderResult build(DebugContext debug, AbstractBlockBase<?> startBlock, AbstractBlockBase<?>[] blocks, TrivialTracePredicate pred) { ! try (Indent indent = Debug.logAndIndent("BiDirectionalTraceBuilder: start trace building")) { ! ArrayList<Trace> traces = buildTraces(); ! try (Indent indent = debug.logAndIndent("BiDirectionalTraceBuilder: start trace building")) { ! ArrayList<Trace> traces = buildTraces(debug); assert traces.get(0).getBlocks()[0].equals(startBlock) : "The first traces always contains the start block"; ! return TraceBuilderResult.create(debug, blocks, traces, blockToTrace, pred); } } ! protected ArrayList<Trace> buildTraces(DebugContext debug) { ArrayList<Trace> traces = new ArrayList<>(); // process worklist while (!worklist.isEmpty()) { AbstractBlockBase<?> block = worklist.pollFirst(); assert block != null; if (!processed(block)) { ! Trace trace = new Trace(startTrace(debug, block)); for (AbstractBlockBase<?> traceBlock : trace.getBlocks()) { blockToTrace[traceBlock.getId()] = trace; } trace.setId(traces.size()); traces.add(trace);
*** 95,136 **** --- 95,138 ---- return traces; } /** * Build a new trace starting at {@code block}. + * + * @param debug */ @SuppressWarnings("try") ! private Collection<AbstractBlockBase<?>> startTrace(DebugContext debug, AbstractBlockBase<?> block) { ArrayDeque<AbstractBlockBase<?>> trace = new ArrayDeque<>(); ! try (Indent i = Debug.logAndIndent("StartTrace: %s", block)) { ! try (Indent indentFront = Debug.logAndIndent("Head:")) { ! try (Indent i = debug.logAndIndent("StartTrace: %s", block)) { ! try (Indent indentFront = debug.logAndIndent("Head:")) { for (AbstractBlockBase<?> currentBlock = block; currentBlock != null; currentBlock = selectPredecessor(currentBlock)) { ! addBlockToTrace(debug, currentBlock); trace.addFirst(currentBlock); } } /* Number head blocks. Can not do this in the loop as we go backwards. */ int blockNr = 0; for (AbstractBlockBase<?> b : trace) { b.setLinearScanNumber(blockNr++); } ! try (Indent indentBack = Debug.logAndIndent("Tail:")) { ! try (Indent indentBack = debug.logAndIndent("Tail:")) { for (AbstractBlockBase<?> currentBlock = selectSuccessor(block); currentBlock != null; currentBlock = selectSuccessor(currentBlock)) { ! addBlockToTrace(debug, currentBlock); trace.addLast(currentBlock); /* This time we can number the blocks immediately as we go forwards. */ currentBlock.setLinearScanNumber(blockNr++); } } } ! Debug.log("Trace: %s", trace); ! debug.log("Trace: %s", trace); return trace; } ! private void addBlockToTrace(DebugContext debug, AbstractBlockBase<?> currentBlock) { ! Debug.log("add %s (prob: %f)", currentBlock, currentBlock.probability()); ! debug.log("add %s (prob: %f)", currentBlock, currentBlock.probability()); processed.set(currentBlock.getId()); } /** * @return The unprocessed predecessor with the highest probability, or {@code null}.

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