Search in sources :

Example 1 with Trace

use of org.graalvm.compiler.core.common.alloc.Trace in project graal by oracle.

the class TraceRegisterAllocationPhase method run.

@Override
@SuppressWarnings("try")
protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) {
    MoveFactory spillMoveFactory = context.spillMoveFactory;
    RegisterAllocationConfig registerAllocationConfig = context.registerAllocationConfig;
    LIR lir = lirGenRes.getLIR();
    DebugContext debug = lir.getDebug();
    TraceBuilderResult resultTraces = context.contextLookup(TraceBuilderResult.class);
    GlobalLivenessInfo livenessInfo = context.contextLookup(GlobalLivenessInfo.class);
    assert livenessInfo != null;
    TraceAllocationContext traceContext = new TraceAllocationContext(spillMoveFactory, registerAllocationConfig, resultTraces, livenessInfo);
    AllocatableValue[] cachedStackSlots = Options.TraceRACacheStackSlots.getValue(lir.getOptions()) ? new AllocatableValue[lir.numVariables()] : null;
    // currently this is not supported
    boolean neverSpillConstant = false;
    final TraceRegisterAllocationPolicy plan = DefaultTraceRegisterAllocationPolicy.allocationPolicy(target, lirGenRes, spillMoveFactory, registerAllocationConfig, cachedStackSlots, resultTraces, neverSpillConstant, livenessInfo, lir.getOptions());
    try (DebugContext.Scope s0 = debug.scope("AllocateTraces", resultTraces, livenessInfo)) {
        for (Trace trace : resultTraces.getTraces()) {
            tracesCounter.increment(debug);
            TraceAllocationPhase<TraceAllocationContext> allocator = plan.selectStrategy(trace);
            try (Indent i = debug.logAndIndent("Allocating Trace%d: %s (%s)", trace.getId(), trace, allocator);
                DebugContext.Scope s = debug.scope("AllocateTrace", trace)) {
                allocator.apply(target, lirGenRes, trace, traceContext);
            }
        }
    } catch (Throwable e) {
        throw debug.handle(e);
    }
    TraceGlobalMoveResolutionPhase.resolve(target, lirGenRes, traceContext);
    deconstructSSAForm(lir);
}
Also used : Indent(org.graalvm.compiler.debug.Indent) DebugContext(org.graalvm.compiler.debug.DebugContext) TraceAllocationContext(org.graalvm.compiler.lir.alloc.trace.TraceAllocationPhase.TraceAllocationContext) AllocatableValue(jdk.vm.ci.meta.AllocatableValue) Trace(org.graalvm.compiler.core.common.alloc.Trace) LIR(org.graalvm.compiler.lir.LIR) RegisterAllocationConfig(org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig) TraceBuilderResult(org.graalvm.compiler.core.common.alloc.TraceBuilderResult) MoveFactory(org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory)

Example 2 with Trace

use of org.graalvm.compiler.core.common.alloc.Trace in project graal by oracle.

the class CFGPrinter method printTraceProlog.

private void printTraceProlog(Trace trace, TraceBuilderResult traceBuilderResult) {
    begin("block");
    out.print("name \"").print(traceToString(trace)).println('"');
    out.println("from_bci -1");
    out.println("to_bci -1");
    out.print("predecessors ");
    for (Trace pred : getPredecessors(trace, traceBuilderResult)) {
        out.print("\"").print(traceToString(pred)).print("\" ");
    }
    out.println();
    out.print("successors ");
    for (Trace succ : getSuccessors(trace, traceBuilderResult)) {
        // if (!succ.isExceptionEntry()) {
        out.print("\"").print(traceToString(succ)).print("\" ");
    // }
    }
    out.println();
    out.print("xhandlers");
    // TODO(je) add support for exception handler
    out.println();
    out.print("flags ");
    // TODO(je) add support for flags
    out.println();
// TODO(je) add support for loop infos
}
Also used : Trace(org.graalvm.compiler.core.common.alloc.Trace)

Example 3 with Trace

use of org.graalvm.compiler.core.common.alloc.Trace in project graal by oracle.

the class CFGPrinter method getSuccessors.

private static List<Trace> getSuccessors(Trace trace, TraceBuilderResult traceBuilderResult) {
    BitSet bs = new BitSet(traceBuilderResult.getTraces().size());
    for (AbstractBlockBase<?> block : trace.getBlocks()) {
        for (AbstractBlockBase<?> s : block.getSuccessors()) {
            Trace otherTrace = traceBuilderResult.getTraceForBlock(s);
            int otherTraceId = otherTrace.getId();
            if (trace.getId() != otherTraceId || isLoopBackEdge(block, s)) {
                bs.set(otherTraceId);
            }
        }
    }
    List<Trace> succ = new ArrayList<>();
    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
        succ.add(traceBuilderResult.getTraces().get(i));
    }
    return succ;
}
Also used : Trace(org.graalvm.compiler.core.common.alloc.Trace) BitSet(java.util.BitSet) ArrayList(java.util.ArrayList)

Example 4 with Trace

use of org.graalvm.compiler.core.common.alloc.Trace in project graal by oracle.

the class CFGPrinter method getPredecessors.

private static List<Trace> getPredecessors(Trace trace, TraceBuilderResult traceBuilderResult) {
    BitSet bs = new BitSet(traceBuilderResult.getTraces().size());
    for (AbstractBlockBase<?> block : trace.getBlocks()) {
        for (AbstractBlockBase<?> p : block.getPredecessors()) {
            Trace otherTrace = traceBuilderResult.getTraceForBlock(p);
            int otherTraceId = otherTrace.getId();
            if (trace.getId() != otherTraceId || isLoopBackEdge(p, block)) {
                bs.set(traceBuilderResult.getTraceForBlock(p).getId());
            }
        }
    }
    List<Trace> pred = new ArrayList<>();
    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
        pred.add(traceBuilderResult.getTraces().get(i));
    }
    return pred;
}
Also used : Trace(org.graalvm.compiler.core.common.alloc.Trace) BitSet(java.util.BitSet) ArrayList(java.util.ArrayList)

Example 5 with Trace

use of org.graalvm.compiler.core.common.alloc.Trace in project graal by oracle.

the class CFGPrinter method printTraces.

public void printTraces(String label, TraceBuilderResult traces) {
    begin("cfg");
    out.print("name \"").print(label).println('"');
    for (Trace trace : traces.getTraces()) {
        printTrace(trace, traces);
    }
    end("cfg");
}
Also used : Trace(org.graalvm.compiler.core.common.alloc.Trace)

Aggregations

Trace (org.graalvm.compiler.core.common.alloc.Trace)8 LIR (org.graalvm.compiler.lir.LIR)4 TraceBuilderResult (org.graalvm.compiler.core.common.alloc.TraceBuilderResult)3 DebugContext (org.graalvm.compiler.debug.DebugContext)3 ArrayList (java.util.ArrayList)2 BitSet (java.util.BitSet)2 AbstractBlockBase (org.graalvm.compiler.core.common.cfg.AbstractBlockBase)2 Indent (org.graalvm.compiler.debug.Indent)2 BufferedOutputStream (java.io.BufferedOutputStream)1 FileOutputStream (java.io.FileOutputStream)1 IOException (java.io.IOException)1 OutputStream (java.io.OutputStream)1 Path (java.nio.file.Path)1 CodeCacheProvider (jdk.vm.ci.code.CodeCacheProvider)1 InstalledCode (jdk.vm.ci.code.InstalledCode)1 AllocatableValue (jdk.vm.ci.meta.AllocatableValue)1 ResolvedJavaMethod (jdk.vm.ci.meta.ResolvedJavaMethod)1 BytecodeDisassembler (org.graalvm.compiler.bytecode.BytecodeDisassembler)1 CompilationResult (org.graalvm.compiler.code.CompilationResult)1 RegisterAllocationConfig (org.graalvm.compiler.core.common.alloc.RegisterAllocationConfig)1