Search in sources :

Example 6 with LoopEx

use of org.graalvm.compiler.loop.LoopEx in project graal by oracle.

the class LoopFullUnrollPhase method run.

@Override
protected void run(StructuredGraph graph, PhaseContext context) {
    DebugContext debug = graph.getDebug();
    if (graph.hasLoops()) {
        boolean peeled;
        do {
            peeled = false;
            final LoopsData dataCounted = new LoopsData(graph);
            dataCounted.detectedCountedLoops();
            for (LoopEx loop : dataCounted.countedLoops()) {
                if (getPolicies().shouldFullUnroll(loop)) {
                    debug.log("FullUnroll %s", loop);
                    LoopTransformations.fullUnroll(loop, context, canonicalizer);
                    FULLY_UNROLLED_LOOPS.increment(debug);
                    debug.dump(DebugContext.DETAILED_LEVEL, graph, "FullUnroll %s", loop);
                    peeled = true;
                    break;
                }
            }
            dataCounted.deleteUnusedNodes();
        } while (peeled);
    }
}
Also used : LoopsData(org.graalvm.compiler.loop.LoopsData) LoopEx(org.graalvm.compiler.loop.LoopEx) DebugContext(org.graalvm.compiler.debug.DebugContext)

Example 7 with LoopEx

use of org.graalvm.compiler.loop.LoopEx in project graal by oracle.

the class LoopPartialUnrollPhase method checkCounted.

private static boolean checkCounted(StructuredGraph graph, Graph.Mark mark) {
    LoopsData dataCounted;
    dataCounted = new LoopsData(graph);
    dataCounted.detectedCountedLoops();
    for (LoopEx anyLoop : dataCounted.loops()) {
        if (graph.isNew(mark, anyLoop.loopBegin())) {
            assert anyLoop.isCounted() : "pre/post transformation loses counted loop " + anyLoop.loopBegin();
        }
    }
    return true;
}
Also used : LoopsData(org.graalvm.compiler.loop.LoopsData) LoopEx(org.graalvm.compiler.loop.LoopEx)

Example 8 with LoopEx

use of org.graalvm.compiler.loop.LoopEx in project graal by oracle.

the class LoopPartialUnrollPhase method run.

@Override
@SuppressWarnings("try")
protected void run(StructuredGraph graph, PhaseContext context) {
    if (graph.hasLoops()) {
        HashSetNodeEventListener listener = new HashSetNodeEventListener();
        boolean changed = true;
        while (changed) {
            changed = false;
            try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) {
                LoopsData dataCounted = new LoopsData(graph);
                dataCounted.detectedCountedLoops();
                Graph.Mark mark = graph.getMark();
                boolean prePostInserted = false;
                for (LoopEx loop : dataCounted.countedLoops()) {
                    if (!LoopTransformations.isUnrollableLoop(loop)) {
                        continue;
                    }
                    if (getPolicies().shouldPartiallyUnroll(loop)) {
                        if (loop.loopBegin().isSimpleLoop()) {
                            // First perform the pre/post transformation and do the partial
                            // unroll when we come around again.
                            LoopTransformations.insertPrePostLoops(loop);
                            prePostInserted = true;
                        } else {
                            LoopTransformations.partialUnroll(loop);
                        }
                        changed = true;
                    }
                }
                dataCounted.deleteUnusedNodes();
                if (!listener.getNodes().isEmpty()) {
                    canonicalizer.applyIncremental(graph, context, listener.getNodes());
                    listener.getNodes().clear();
                }
                assert !prePostInserted || checkCounted(graph, mark);
            }
        }
    }
}
Also used : HashSetNodeEventListener(org.graalvm.compiler.phases.common.util.HashSetNodeEventListener) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) Graph(org.graalvm.compiler.graph.Graph) LoopsData(org.graalvm.compiler.loop.LoopsData) LoopEx(org.graalvm.compiler.loop.LoopEx)

Example 9 with LoopEx

use of org.graalvm.compiler.loop.LoopEx in project graal by oracle.

the class LoopPeelingPhase method run.

@Override
@SuppressWarnings("try")
protected void run(StructuredGraph graph, PhaseContext context) {
    DebugContext debug = graph.getDebug();
    if (graph.hasLoops()) {
        LoopsData data = new LoopsData(graph);
        try (DebugContext.Scope s = debug.scope("peeling", data.getCFG())) {
            for (LoopEx loop : data.outerFirst()) {
                if (getPolicies().shouldPeel(loop, data.getCFG(), context.getMetaAccess())) {
                    debug.log("Peeling %s", loop);
                    LoopTransformations.peel(loop);
                    debug.dump(DebugContext.DETAILED_LEVEL, graph, "Peeling %s", loop);
                }
            }
            data.deleteUnusedNodes();
        } catch (Throwable t) {
            throw debug.handle(t);
        }
    }
}
Also used : LoopsData(org.graalvm.compiler.loop.LoopsData) LoopEx(org.graalvm.compiler.loop.LoopEx) DebugContext(org.graalvm.compiler.debug.DebugContext)

Example 10 with LoopEx

use of org.graalvm.compiler.loop.LoopEx 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)

Aggregations

LoopEx (org.graalvm.compiler.loop.LoopEx)14 LoopsData (org.graalvm.compiler.loop.LoopsData)14 DebugContext (org.graalvm.compiler.debug.DebugContext)5 GraalCompilerTest (org.graalvm.compiler.core.test.GraalCompilerTest)3 Test (org.junit.Test)3 HashSet (java.util.HashSet)2 StructuredGraph (org.graalvm.compiler.nodes.StructuredGraph)2 CanonicalizerPhase (org.graalvm.compiler.phases.common.CanonicalizerPhase)2 ResolvedJavaField (jdk.vm.ci.meta.ResolvedJavaField)1 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)1 CompilationIdentifier (org.graalvm.compiler.core.common.CompilationIdentifier)1 Graph (org.graalvm.compiler.graph.Graph)1 Mark (org.graalvm.compiler.graph.Graph.Mark)1 Node (org.graalvm.compiler.graph.Node)1 LoopFragmentInside (org.graalvm.compiler.loop.LoopFragmentInside)1 ControlSplitNode (org.graalvm.compiler.nodes.ControlSplitNode)1 FieldLocationIdentity (org.graalvm.compiler.nodes.FieldLocationIdentity)1 FixedNode (org.graalvm.compiler.nodes.FixedNode)1 Invoke (org.graalvm.compiler.nodes.Invoke)1 LoopBeginNode (org.graalvm.compiler.nodes.LoopBeginNode)1