Search in sources :

Example 41 with Block

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

the class SchedulingTest2 method testValueProxyInputs.

@Test
public void testValueProxyInputs() {
    StructuredGraph graph = parseEager("testSnippet", AllowAssumptions.YES);
    DebugContext debug = graph.getDebug();
    ReturnNode returnNode = graph.getNodes(ReturnNode.TYPE).first();
    BeginNode beginNode = graph.add(new BeginNode());
    returnNode.replaceAtPredecessor(beginNode);
    beginNode.setNext(returnNode);
    debug.dump(DebugContext.BASIC_LEVEL, graph, "Graph");
    SchedulePhase schedulePhase = new SchedulePhase(SchedulingStrategy.EARLIEST_WITH_GUARD_ORDER);
    schedulePhase.apply(graph);
    ScheduleResult schedule = graph.getLastSchedule();
    BlockMap<List<Node>> blockToNodesMap = schedule.getBlockToNodesMap();
    NodeMap<Block> nodeToBlock = schedule.getNodeToBlockMap();
    assertDeepEquals(2, schedule.getCFG().getBlocks().length);
    for (BinaryArithmeticNode<?> node : graph.getNodes().filter(BinaryArithmeticNode.class)) {
        if (node instanceof AddNode) {
            assertTrue(node.toString() + " expected: " + nodeToBlock.get(beginNode) + " but was: " + nodeToBlock.get(node), nodeToBlock.get(node) != nodeToBlock.get(beginNode));
        }
    }
    for (FrameState fs : graph.getNodes(FrameState.TYPE)) {
        Block block = nodeToBlock.get(fs);
        assertTrue(fs.toString(), block == schedule.getCFG().getStartBlock());
        for (Node usage : fs.usages()) {
            if (usage instanceof StateSplit && ((StateSplit) usage).stateAfter() == fs) {
                assertTrue(usage.toString(), nodeToBlock.get(usage) == block);
                if (usage != block.getBeginNode()) {
                    List<Node> map = blockToNodesMap.get(block);
                    assertTrue(map.indexOf(fs) + " < " + map.indexOf(usage), map.indexOf(fs) < map.indexOf(usage));
                }
            }
        }
    }
    PhaseContext context = new PhaseContext(getProviders());
    new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.HIGH_TIER).apply(graph, context);
    new LoweringPhase(new CanonicalizerPhase(), LoweringTool.StandardLoweringStage.MID_TIER).apply(graph, context);
    MidTierContext midContext = new MidTierContext(getProviders(), getTargetProvider(), OptimisticOptimizations.ALL, graph.getProfilingInfo());
    new GuardLoweringPhase().apply(graph, midContext);
    FrameStateAssignmentPhase phase = new FrameStateAssignmentPhase();
    phase.apply(graph);
    schedulePhase.apply(graph);
    schedule = graph.getLastSchedule();
    blockToNodesMap = schedule.getBlockToNodesMap();
    nodeToBlock = schedule.getNodeToBlockMap();
    for (FrameState fs : graph.getNodes(FrameState.TYPE)) {
        Block block = nodeToBlock.get(fs);
        assertTrue(fs.toString(), block == schedule.getCFG().getStartBlock());
        for (Node usage : fs.usages()) {
            if ((usage instanceof StateSplit && ((StateSplit) usage).stateAfter() == fs) || (usage instanceof DeoptDuring && ((DeoptDuring) usage).stateDuring() == fs)) {
                assertTrue(usage.toString(), nodeToBlock.get(usage) == block);
                if (usage != block.getBeginNode()) {
                    List<Node> map = blockToNodesMap.get(block);
                    assertTrue(map.indexOf(fs) + " < " + map.indexOf(usage), map.indexOf(fs) < map.indexOf(usage));
                }
            }
        }
    }
}
Also used : FrameStateAssignmentPhase(org.graalvm.compiler.phases.common.FrameStateAssignmentPhase) SchedulePhase(org.graalvm.compiler.phases.schedule.SchedulePhase) ScheduleResult(org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult) AddNode(org.graalvm.compiler.nodes.calc.AddNode) BeginNode(org.graalvm.compiler.nodes.BeginNode) ReturnNode(org.graalvm.compiler.nodes.ReturnNode) BinaryArithmeticNode(org.graalvm.compiler.nodes.calc.BinaryArithmeticNode) Node(org.graalvm.compiler.graph.Node) GuardLoweringPhase(org.graalvm.compiler.phases.common.GuardLoweringPhase) LoweringPhase(org.graalvm.compiler.phases.common.LoweringPhase) DebugContext(org.graalvm.compiler.debug.DebugContext) FrameState(org.graalvm.compiler.nodes.FrameState) PhaseContext(org.graalvm.compiler.phases.tiers.PhaseContext) ReturnNode(org.graalvm.compiler.nodes.ReturnNode) MidTierContext(org.graalvm.compiler.phases.tiers.MidTierContext) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) BeginNode(org.graalvm.compiler.nodes.BeginNode) DeoptDuring(org.graalvm.compiler.nodes.DeoptimizingNode.DeoptDuring) Block(org.graalvm.compiler.nodes.cfg.Block) List(java.util.List) CanonicalizerPhase(org.graalvm.compiler.phases.common.CanonicalizerPhase) AddNode(org.graalvm.compiler.nodes.calc.AddNode) GuardLoweringPhase(org.graalvm.compiler.phases.common.GuardLoweringPhase) StateSplit(org.graalvm.compiler.nodes.StateSplit) Test(org.junit.Test)

Example 42 with Block

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

the class SimpleCFGTest method assertDominatedSize.

public static void assertDominatedSize(Block block, int size) {
    int count = 0;
    Block domChild = block.getFirstDominated();
    while (domChild != null) {
        count++;
        domChild = domChild.getDominatedSibling();
    }
    Assert.assertEquals("number of dominated blocks of " + block, size, count);
}
Also used : Block(org.graalvm.compiler.nodes.cfg.Block)

Example 43 with Block

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

the class LoopSafepointEliminationPhase method run.

@Override
protected void run(StructuredGraph graph, MidTierContext context) {
    LoopsData loops = new LoopsData(graph);
    if (context.getOptimisticOptimizations().useLoopLimitChecks(graph.getOptions()) && graph.getGuardsStage().allowsFloatingGuards()) {
        loops.detectedCountedLoops();
        for (LoopEx loop : loops.countedLoops()) {
            if (loop.loop().getChildren().isEmpty() && loop.counted().getStamp().getBits() <= 32) {
                boolean hasSafepoint = false;
                for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) {
                    hasSafepoint |= loopEnd.canSafepoint();
                }
                if (hasSafepoint) {
                    loop.counted().createOverFlowGuard();
                    loop.loopBegin().disableSafepoint();
                }
            }
        }
    }
    for (LoopEx loop : loops.loops()) {
        for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) {
            Block b = loops.getCFG().blockFor(loopEnd);
            blocks: while (b != loop.loop().getHeader()) {
                assert b != null;
                for (FixedNode node : b.getNodes()) {
                    if (node instanceof Invoke || (node instanceof ForeignCallNode && ((ForeignCallNode) node).isGuaranteedSafepoint())) {
                        loopEnd.disableSafepoint();
                        break blocks;
                    }
                }
                b = b.getDominator();
            }
        }
    }
    loops.deleteUnusedNodes();
}
Also used : LoopsData(org.graalvm.compiler.loop.LoopsData) ForeignCallNode(org.graalvm.compiler.nodes.extended.ForeignCallNode) LoopEx(org.graalvm.compiler.loop.LoopEx) Block(org.graalvm.compiler.nodes.cfg.Block) FixedNode(org.graalvm.compiler.nodes.FixedNode) LoopEndNode(org.graalvm.compiler.nodes.LoopEndNode) Invoke(org.graalvm.compiler.nodes.Invoke)

Example 44 with Block

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

the class NodeLIRBuilder method getLIRBlock.

public LabelRef getLIRBlock(FixedNode b) {
    assert gen.getResult().getLIR().getControlFlowGraph() instanceof ControlFlowGraph;
    Block result = ((ControlFlowGraph) gen.getResult().getLIR().getControlFlowGraph()).blockFor(b);
    int suxIndex = 0;
    for (AbstractBlockBase<?> succ : gen.getCurrentBlock().getSuccessors()) {
        if (succ == result) {
            assert gen.getCurrentBlock() instanceof Block;
            return LabelRef.forSuccessor(gen.getResult().getLIR(), gen.getCurrentBlock(), suxIndex);
        }
        suxIndex++;
    }
    throw GraalError.shouldNotReachHere("Block not in successor list of current block");
}
Also used : ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) LIR.verifyBlock(org.graalvm.compiler.lir.LIR.verifyBlock) Block(org.graalvm.compiler.nodes.cfg.Block)

Example 45 with Block

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

the class CFGPrinter method printSchedule.

public void printSchedule(String message, ScheduleResult theSchedule) {
    schedule = theSchedule;
    cfg = schedule.getCFG();
    printedNodes = new NodeBitMap(cfg.graph);
    begin("cfg");
    out.print("name \"").print(message).println('"');
    for (Block b : schedule.getCFG().getBlocks()) {
        if (schedule.nodesFor(b) != null) {
            printScheduledBlock(b, schedule.nodesFor(b));
        }
    }
    end("cfg");
    schedule = null;
    cfg = null;
    printedNodes = null;
}
Also used : NodeBitMap(org.graalvm.compiler.graph.NodeBitMap) 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