Search in sources :

Example 46 with Block

use of org.graalvm.compiler.nodes.cfg.Block in project graal by oracle.

the class CFGPrinter method schedule.

private void schedule(Node input, Block block) {
    if (!inFixedSchedule(input)) {
        Block inputBlock = block;
        if (latestScheduling.get(input) != null) {
            inputBlock = AbstractControlFlowGraph.commonDominatorTyped(inputBlock, latestScheduling.get(input));
        }
        if (inputBlock != latestScheduling.get(input)) {
            latestScheduling.set(input, inputBlock);
            scheduleInputs(input, inputBlock);
        }
    }
}
Also used : Block(org.graalvm.compiler.nodes.cfg.Block)

Example 47 with Block

use of org.graalvm.compiler.nodes.cfg.Block in project graal by oracle.

the class CFGPrinter method scheduleInputs.

private void scheduleInputs(Node node, Block nodeBlock) {
    if (node instanceof ValuePhiNode) {
        PhiNode phi = (PhiNode) node;
        Block phiBlock = latestScheduling.get(phi.merge());
        assert phiBlock != null;
        for (Block pred : phiBlock.getPredecessors()) {
            schedule(phi.valueAt((AbstractEndNode) pred.getEndNode()), pred);
        }
    } else {
        for (Node input : node.inputs()) {
            schedule(input, nodeBlock);
        }
    }
}
Also used : ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) PhiNode(org.graalvm.compiler.nodes.PhiNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) FloatingNode(org.graalvm.compiler.nodes.calc.FloatingNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) Node(org.graalvm.compiler.graph.Node) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) PhiNode(org.graalvm.compiler.nodes.PhiNode) Block(org.graalvm.compiler.nodes.cfg.Block)

Example 48 with Block

use of org.graalvm.compiler.nodes.cfg.Block in project graal by oracle.

the class CFGPrinter method printCFG.

/**
 * Prints the specified list of blocks.
 *
 * @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, AbstractBlockBase<?>[] blocks, boolean printNodes) {
    if (lir == null) {
        latestScheduling = new NodeMap<>(cfg.getNodeToBlock());
        for (AbstractBlockBase<?> abstractBlock : blocks) {
            if (abstractBlock == null) {
                continue;
            }
            Block block = (Block) abstractBlock;
            Node cur = block.getBeginNode();
            while (true) {
                assert inFixedSchedule(cur) && latestScheduling.get(cur) == block;
                scheduleInputs(cur, block);
                if (cur == block.getEndNode()) {
                    break;
                }
                assert cur.successors().count() == 1;
                cur = cur.successors().first();
            }
        }
    }
    begin("cfg");
    out.print("name \"").print(label).println('"');
    for (AbstractBlockBase<?> block : blocks) {
        printBlock(block, printNodes);
    }
    end("cfg");
    // As a workaround we dump the bytecode after every cfg.
    if (method != null) {
        printBytecodes(new BytecodeDisassembler(false).disassemble(method));
    }
    latestScheduling = null;
}
Also used : BytecodeDisassembler(org.graalvm.compiler.bytecode.BytecodeDisassembler) FloatingNode(org.graalvm.compiler.nodes.calc.FloatingNode) ValuePhiNode(org.graalvm.compiler.nodes.ValuePhiNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) ValueNode(org.graalvm.compiler.nodes.ValueNode) Node(org.graalvm.compiler.graph.Node) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) PhiNode(org.graalvm.compiler.nodes.PhiNode) Block(org.graalvm.compiler.nodes.cfg.Block)

Example 49 with Block

use of org.graalvm.compiler.nodes.cfg.Block in project graal by oracle.

the class CanonicalStringGraphPrinter method writeCanonicalExpressionCFGString.

protected static void writeCanonicalExpressionCFGString(StructuredGraph graph, boolean checkConstants, boolean removeIdentities, PrintWriter writer) {
    ControlFlowGraph controlFlowGraph = getControlFlowGraph(graph);
    if (controlFlowGraph == null) {
        return;
    }
    try {
        for (Block block : controlFlowGraph.getBlocks()) {
            writer.print("Block ");
            writer.print(block);
            writer.print(" ");
            if (block == controlFlowGraph.getStartBlock()) {
                writer.print("* ");
            }
            writer.print("-> ");
            for (Block successor : block.getSuccessors()) {
                writer.print(successor);
                writer.print(" ");
            }
            writer.println();
            FixedNode node = block.getBeginNode();
            while (node != null) {
                writeCanonicalGraphExpressionString(node, checkConstants, removeIdentities, writer);
                writer.println();
                if (node instanceof FixedWithNextNode) {
                    node = ((FixedWithNextNode) node).next();
                } else {
                    node = null;
                }
            }
        }
    } catch (Throwable e) {
        writer.println();
        e.printStackTrace(writer);
    }
}
Also used : FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) Block(org.graalvm.compiler.nodes.cfg.Block) FixedNode(org.graalvm.compiler.nodes.FixedNode)

Example 50 with Block

use of org.graalvm.compiler.nodes.cfg.Block in project graal by oracle.

the class ReentrantBlockIterator method recurseIntoLoop.

private static <StateT> void recurseIntoLoop(BlockIteratorClosure<StateT> closure, Deque<Block> blockQueue, EconomicMap<FixedNode, StateT> states, StateT state, Block successor) {
    // recurse into the loop
    Loop<Block> loop = successor.getLoop();
    LoopBeginNode loopBegin = (LoopBeginNode) loop.getHeader().getBeginNode();
    assert successor.getBeginNode() == loopBegin;
    List<StateT> exitStates = closure.processLoop(loop, state);
    int i = 0;
    assert loop.getExits().size() == exitStates.size();
    for (Block exit : loop.getExits()) {
        states.put(exit.getBeginNode(), exitStates.get(i++));
        blockQueue.addFirst(exit);
    }
}
Also used : LoopBeginNode(org.graalvm.compiler.nodes.LoopBeginNode) Block(org.graalvm.compiler.nodes.cfg.Block)

Aggregations

Block (org.graalvm.compiler.nodes.cfg.Block)54 Node (org.graalvm.compiler.graph.Node)20 FixedNode (org.graalvm.compiler.nodes.FixedNode)17 StructuredGraph (org.graalvm.compiler.nodes.StructuredGraph)14 ScheduleResult (org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult)14 ValueNode (org.graalvm.compiler.nodes.ValueNode)14 AbstractBeginNode (org.graalvm.compiler.nodes.AbstractBeginNode)13 AbstractMergeNode (org.graalvm.compiler.nodes.AbstractMergeNode)13 FixedWithNextNode (org.graalvm.compiler.nodes.FixedWithNextNode)13 LoopBeginNode (org.graalvm.compiler.nodes.LoopBeginNode)13 ControlFlowGraph (org.graalvm.compiler.nodes.cfg.ControlFlowGraph)12 SchedulePhase (org.graalvm.compiler.phases.schedule.SchedulePhase)11 ConstantNode (org.graalvm.compiler.nodes.ConstantNode)9 LoopExitNode (org.graalvm.compiler.nodes.LoopExitNode)9 PhiNode (org.graalvm.compiler.nodes.PhiNode)9 List (java.util.List)8 DebugContext (org.graalvm.compiler.debug.DebugContext)8 AbstractEndNode (org.graalvm.compiler.nodes.AbstractEndNode)8 ArrayList (java.util.ArrayList)7 ReturnNode (org.graalvm.compiler.nodes.ReturnNode)7