# HG changeset patch # User Doug Simon # Date 1377015823 -7200 # Node ID 0942e34b6c7d0853766fae417741e22cdf2103c4 # Parent 7e297d001c30381fc73870ee8319431ef6f07631 added PrintBackendCFG option (default is true) for controlling if backend output is dumped to the C1Visualizer diff -r 7e297d001c30 -r 0942e34b6c7d graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Tue Aug 20 16:09:26 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/GraalOptions.java Tue Aug 20 18:23:43 2013 +0200 @@ -146,12 +146,14 @@ @Option(help = "") public static final OptionValue GCDebugStartCycle = new OptionValue<>(-1); // Ideal graph visualizer output settings - @Option(help = "") + @Option(help = "Dump IdealGraphVisualizer output in binary format") public static final OptionValue PrintBinaryGraphs = new OptionValue<>(true); - @Option(help = "outputs probabilities for fixed nodes during binary graph dumping") + @Option(help = "Output probabilities for fixed nodes during binary graph dumping") public static final OptionValue PrintGraphProbabilities = new OptionValue<>(false); - @Option(help = "") + @Option(help = "Enables dumping to the C1Visualizer. Enabling this option implies PrintBackendCFG.") public static final OptionValue PrintCFG = new OptionValue<>(false); + @Option(help = "Enables dumping LIR, register allocation and code generation info to the C1Visualizer.") + public static final OptionValue PrintBackendCFG = new OptionValue<>(true); @Option(help = "") public static final OptionValue PrintIdealGraphFile = new OptionValue<>(false); @Option(help = "") @@ -245,7 +247,7 @@ public static final OptionValue MinTableSwitchDensity = new OptionValue<>(0.5); // Ahead of time compilation - @Option(help = "configure compiler to emit code compatible with AOT requirements for HotSpot") + @Option(help = "Configure compiler to emit code compatible with AOT requirements for HotSpot") public static final OptionValue AOTCompilation = new OptionValue<>(false); // Runtime settings diff -r 7e297d001c30 -r 0942e34b6c7d graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Tue Aug 20 16:09:26 2013 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Tue Aug 20 18:23:43 2013 +0200 @@ -127,7 +127,7 @@ * @param label A label describing the compilation phase that produced the control flow graph. * @param blocks The list of blocks to be printed. */ - public void printCFG(String label, List blocks) { + public void printCFG(String label, List blocks, boolean printNodes) { if (lir == null) { latestScheduling = new NodeMap<>(cfg.getNodeToBlock()); for (Block block : blocks) { @@ -149,7 +149,7 @@ begin("cfg"); out.print("name \"").print(label).println('"'); for (Block block : blocks) { - printBlock(block); + printBlock(block, printNodes); } end("cfg"); @@ -185,7 +185,7 @@ } } - private void printBlock(Block block) { + private void printBlock(Block block, boolean printNodes) { begin("block"); out.print("name \"").print(blockToString(block)).println('"'); @@ -231,7 +231,9 @@ out.print("loop_depth ").println(block.getLoop().depth); } - printNodes(block); + if (printNodes) { + printNodes(block); + } printLIR(block); end("block"); } diff -r 7e297d001c30 -r 0942e34b6c7d graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Tue Aug 20 16:09:26 2013 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinterObserver.java Tue Aug 20 18:23:43 2013 +0200 @@ -47,6 +47,12 @@ private File cfgFile; private JavaMethod curMethod; private List curDecorators = Collections.emptyList(); + private final boolean dumpFrontend; + private Object previousObject; + + public CFGPrinterObserver(boolean dumpFrontend) { + this.dumpFrontend = dumpFrontend; + } @Override public void dump(Object object, String message) { @@ -100,8 +106,16 @@ private static final long timestamp = System.currentTimeMillis(); private static final AtomicInteger uniqueId = new AtomicInteger(); + private static boolean isFrontendObject(Object object) { + return object instanceof Graph || object instanceof BciBlockMapping; + } + public void dumpSandboxed(Object object, String message) { + if (!dumpFrontend && isFrontendObject(object)) { + return; + } + if (cfgPrinter == null) { cfgFile = new File("compilations-" + timestamp + "_" + uniqueId.incrementAndGet() + ".cfg"); try { @@ -143,14 +157,17 @@ } } else if (object instanceof LIR) { - cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder()); + // No need to print the HIR nodes again if this is not the first + // time dumping the same LIR since the HIR will not have changed. + boolean printNodes = previousObject != object; + cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder(), printNodes); } else if (object instanceof StructuredGraph) { if (cfgPrinter.cfg == null) { StructuredGraph graph = (StructuredGraph) object; cfgPrinter.cfg = ControlFlowGraph.compute(graph, true, true, true, false); } - cfgPrinter.printCFG(message, Arrays.asList(cfgPrinter.cfg.getBlocks())); + cfgPrinter.printCFG(message, Arrays.asList(cfgPrinter.cfg.getBlocks()), true); } else if (object instanceof CompilationResult) { final CompilationResult compResult = (CompilationResult) object; @@ -168,6 +185,8 @@ cfgPrinter.lirGenerator = null; cfgPrinter.cfg = null; cfgPrinter.flush(); + + previousObject = object; } private static boolean isCompilationResultAndInstalledCode(Object object) { diff -r 7e297d001c30 -r 0942e34b6c7d graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java Tue Aug 20 16:09:26 2013 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/DebugEnvironment.java Tue Aug 20 18:23:43 2013 +0200 @@ -37,11 +37,11 @@ Debug.enable(); List dumpHandlers = new ArrayList<>(); dumpHandlers.add(new GraphPrinterDumpHandler()); - if (PrintCFG.getValue()) { - if (PrintBinaryGraphs.getValue()) { - TTY.println("CFG dumping slows down PrintBinaryGraphs: use -G:-PrintCFG to disable it"); + if (PrintCFG.getValue() || PrintBackendCFG.getValue()) { + if (PrintBinaryGraphs.getValue() && PrintCFG.getValue()) { + TTY.println("Complete C1Visualizer dumping slows down PrintBinaryGraphs: use -G:-PrintCFG to disable it"); } - dumpHandlers.add(new CFGPrinterObserver()); + dumpHandlers.add(new CFGPrinterObserver(PrintCFG.getValue())); } if (DecompileAfterPhase.getValue() != null) { dumpHandlers.add(new DecompilerDebugDumpHandler());