Search in sources :

Example 6 with Block

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

the class ProfileCompiledMethodsPhase method run.

@Override
protected void run(StructuredGraph graph) {
    SchedulePhase schedule = new SchedulePhase(graph.getOptions());
    schedule.apply(graph, false);
    ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true);
    for (Loop<Block> loop : cfg.getLoops()) {
        double loopProbability = cfg.blockFor(loop.getHeader().getBeginNode()).probability();
        if (loopProbability > (1D / Integer.MAX_VALUE)) {
            addSectionCounters(loop.getHeader().getBeginNode(), loop.getBlocks(), loop.getChildren(), graph.getLastSchedule(), cfg);
        }
    }
    // don't put the counter increase directly after the start (problems with OSR)
    FixedWithNextNode current = graph.start();
    while (current.next() instanceof FixedWithNextNode) {
        current = (FixedWithNextNode) current.next();
    }
    addSectionCounters(current, Arrays.asList(cfg.getBlocks()), cfg.getLoops(), graph.getLastSchedule(), cfg);
    if (WITH_INVOKES) {
        for (Node node : graph.getNodes()) {
            if (node instanceof Invoke) {
                Invoke invoke = (Invoke) node;
                DynamicCounterNode.addCounterBefore(GROUP_NAME_INVOKES, invoke.callTarget().targetName(), 1, true, invoke.asNode());
            }
        }
    }
}
Also used : FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) SchedulePhase(org.graalvm.compiler.phases.schedule.SchedulePhase) ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) ConstantNode(org.graalvm.compiler.nodes.ConstantNode) ReinterpretNode(org.graalvm.compiler.nodes.calc.ReinterpretNode) RemNode(org.graalvm.compiler.nodes.calc.RemNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) IntegerDivRemNode(org.graalvm.compiler.nodes.calc.IntegerDivRemNode) BinaryNode(org.graalvm.compiler.nodes.calc.BinaryNode) SwitchNode(org.graalvm.compiler.nodes.extended.SwitchNode) NotNode(org.graalvm.compiler.nodes.calc.NotNode) MonitorIdNode(org.graalvm.compiler.nodes.java.MonitorIdNode) ParameterNode(org.graalvm.compiler.nodes.ParameterNode) AccessMonitorNode(org.graalvm.compiler.nodes.java.AccessMonitorNode) AbstractNewObjectNode(org.graalvm.compiler.nodes.java.AbstractNewObjectNode) DeoptimizeNode(org.graalvm.compiler.nodes.DeoptimizeNode) ReturnNode(org.graalvm.compiler.nodes.ReturnNode) CallTargetNode(org.graalvm.compiler.nodes.CallTargetNode) FixedNode(org.graalvm.compiler.nodes.FixedNode) IfNode(org.graalvm.compiler.nodes.IfNode) VirtualObjectNode(org.graalvm.compiler.nodes.virtual.VirtualObjectNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) AbstractEndNode(org.graalvm.compiler.nodes.AbstractEndNode) LogicNode(org.graalvm.compiler.nodes.LogicNode) SafepointNode(org.graalvm.compiler.nodes.SafepointNode) UnwindNode(org.graalvm.compiler.nodes.UnwindNode) Node(org.graalvm.compiler.graph.Node) ConvertNode(org.graalvm.compiler.nodes.calc.ConvertNode) MulNode(org.graalvm.compiler.nodes.calc.MulNode) FixedWithNextNode(org.graalvm.compiler.nodes.FixedWithNextNode) DynamicCounterNode(org.graalvm.compiler.nodes.debug.DynamicCounterNode) FloatDivNode(org.graalvm.compiler.nodes.calc.FloatDivNode) Block(org.graalvm.compiler.nodes.cfg.Block) Invoke(org.graalvm.compiler.nodes.Invoke)

Example 7 with Block

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

the class AMD64NodeLIRBuilder method doBlockPrologue.

@Override
public void doBlockPrologue(Block block, OptionValues options) {
    if (MitigateSpeculativeExecutionAttacks.getValue(options)) {
        boolean hasControlSplitPredecessor = false;
        for (Block b : block.getPredecessors()) {
            if (b.getSuccessorCount() > 1) {
                hasControlSplitPredecessor = true;
                break;
            }
        }
        boolean isStartBlock = block.getPredecessorCount() == 0;
        if (hasControlSplitPredecessor || isStartBlock) {
            getLIRGeneratorTool().emitLFence();
        }
    }
}
Also used : Block(org.graalvm.compiler.nodes.cfg.Block)

Example 8 with Block

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

the class ReentrantBlockIteratorTest method getVisitedBlocksInOrder.

private List<Block> getVisitedBlocksInOrder(String snippet) {
    StructuredGraph graph = parseEager(snippet, AllowAssumptions.YES);
    // after FSA to ensure HIR loop data structure does not contain loop exits
    graph.setGuardsStage(GuardsStage.AFTER_FSA);
    ArrayList<Block> blocks = new ArrayList<>();
    class VoidState {
    }
    final VoidState voidState = new VoidState();
    BlockIteratorClosure<VoidState> closure = new BlockIteratorClosure<VoidState>() {

        @Override
        protected VoidState getInitialState() {
            return voidState;
        }

        @Override
        protected VoidState processBlock(Block block, VoidState currentState) {
            // remember the visit order
            blocks.add(block);
            return currentState;
        }

        @Override
        protected VoidState merge(Block merge, List<VoidState> states) {
            return voidState;
        }

        @Override
        protected VoidState cloneState(VoidState oldState) {
            return voidState;
        }

        @Override
        protected List<VoidState> processLoop(Loop<Block> loop, VoidState initialState) {
            return ReentrantBlockIterator.processLoop(this, loop, initialState).exitStates;
        }
    };
    ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, false);
    ReentrantBlockIterator.apply(closure, cfg.getStartBlock());
    // schedule for IGV
    new SchedulePhase(graph.getOptions()).apply(graph);
    return blocks;
}
Also used : Loop(org.graalvm.compiler.core.common.cfg.Loop) BlockIteratorClosure(org.graalvm.compiler.phases.graph.ReentrantBlockIterator.BlockIteratorClosure) SchedulePhase(org.graalvm.compiler.phases.schedule.SchedulePhase) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) ArrayList(java.util.ArrayList) Block(org.graalvm.compiler.nodes.cfg.Block) ArrayList(java.util.ArrayList) List(java.util.List)

Example 9 with Block

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

the class SimpleCFGTest method testImplies.

@Test
public void testImplies() {
    OptionValues options = getInitialOptions();
    DebugContext debug = DebugContext.create(options, new GraalDebugHandlersFactory(getSnippetReflection()));
    StructuredGraph graph = new StructuredGraph.Builder(options, debug, AllowAssumptions.YES).build();
    EndNode trueEnd = graph.add(new EndNode());
    EndNode falseEnd = graph.add(new EndNode());
    AbstractBeginNode trueBegin = graph.add(new BeginNode());
    trueBegin.setNext(trueEnd);
    AbstractBeginNode falseBegin = graph.add(new BeginNode());
    falseBegin.setNext(falseEnd);
    IfNode ifNode = graph.add(new IfNode(null, trueBegin, falseBegin, 0.5));
    graph.start().setNext(ifNode);
    AbstractMergeNode merge = graph.add(new MergeNode());
    merge.addForwardEnd(trueEnd);
    merge.addForwardEnd(falseEnd);
    ReturnNode returnNode = graph.add(new ReturnNode(null));
    merge.setNext(returnNode);
    dumpGraph(graph);
    ControlFlowGraph cfg = ControlFlowGraph.compute(graph, true, true, true, true);
    Block[] blocks = cfg.getBlocks();
    // check number of blocks
    assertDeepEquals(4, blocks.length);
    // check block - node assignment
    assertDeepEquals(blocks[0], cfg.blockFor(graph.start()));
    assertDeepEquals(blocks[0], cfg.blockFor(ifNode));
    assertDeepEquals(blocks[1], cfg.blockFor(trueBegin));
    assertDeepEquals(blocks[1], cfg.blockFor(trueEnd));
    assertDeepEquals(blocks[2], cfg.blockFor(falseBegin));
    assertDeepEquals(blocks[2], cfg.blockFor(falseEnd));
    assertDeepEquals(blocks[3], cfg.blockFor(merge));
    assertDeepEquals(blocks[3], cfg.blockFor(returnNode));
    // check dominators
    assertDominator(blocks[0], null);
    assertDominator(blocks[1], blocks[0]);
    assertDominator(blocks[2], blocks[0]);
    assertDominator(blocks[3], blocks[0]);
    // check dominated
    assertDominatedSize(blocks[0], 3);
    assertDominatedSize(blocks[1], 0);
    assertDominatedSize(blocks[2], 0);
    assertDominatedSize(blocks[3], 0);
    // check postdominators
    assertPostdominator(blocks[0], blocks[3]);
    assertPostdominator(blocks[1], blocks[3]);
    assertPostdominator(blocks[2], blocks[3]);
    assertPostdominator(blocks[3], null);
}
Also used : OptionValues(org.graalvm.compiler.options.OptionValues) DebugContext(org.graalvm.compiler.debug.DebugContext) IfNode(org.graalvm.compiler.nodes.IfNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) GraalDebugHandlersFactory(org.graalvm.compiler.printer.GraalDebugHandlersFactory) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) MergeNode(org.graalvm.compiler.nodes.MergeNode) ReturnNode(org.graalvm.compiler.nodes.ReturnNode) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) EndNode(org.graalvm.compiler.nodes.EndNode) AbstractBeginNode(org.graalvm.compiler.nodes.AbstractBeginNode) BeginNode(org.graalvm.compiler.nodes.BeginNode) ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) Block(org.graalvm.compiler.nodes.cfg.Block) Test(org.junit.Test)

Example 10 with Block

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

the class TypeSystemTest method outputGraph.

public static void outputGraph(StructuredGraph graph, String message) {
    TTY.println("========================= " + message);
    SchedulePhase schedulePhase = new SchedulePhase(graph.getOptions());
    schedulePhase.apply(graph);
    ScheduleResult schedule = graph.getLastSchedule();
    for (Block block : schedule.getCFG().getBlocks()) {
        TTY.print("Block " + block + " ");
        if (block == schedule.getCFG().getStartBlock()) {
            TTY.print("* ");
        }
        TTY.print("-> ");
        for (Block succ : block.getSuccessors()) {
            TTY.print(succ + " ");
        }
        TTY.println();
        for (Node node : schedule.getBlockToNodesMap().get(block)) {
            outputNode(node);
        }
    }
}
Also used : SchedulePhase(org.graalvm.compiler.phases.schedule.SchedulePhase) ScheduleResult(org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult) AbstractMergeNode(org.graalvm.compiler.nodes.AbstractMergeNode) InstanceOfNode(org.graalvm.compiler.nodes.java.InstanceOfNode) Node(org.graalvm.compiler.graph.Node) PhiNode(org.graalvm.compiler.nodes.PhiNode) 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