Search in sources :

Example 11 with AbstractBlockBase

use of org.graalvm.compiler.core.common.cfg.AbstractBlockBase in project graal by oracle.

the class RegisterVerifier method processOperations.

void processOperations(AbstractBlockBase<?> block, final Interval[] inputState) {
    ArrayList<LIRInstruction> ops = allocator.getLIR().getLIRforBlock(block);
    DebugContext debug = allocator.getDebug();
    InstructionValueConsumer useConsumer = new InstructionValueConsumer() {

        @Override
        public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) {
            // we skip spill moves inserted by the spill position optimization
            if (LinearScan.isVariableOrRegister(operand) && allocator.isProcessed(operand) && op.id() != LinearScan.DOMINATOR_SPILL_MOVE_ID) {
                Interval interval = intervalAt(operand);
                if (op.id() != -1) {
                    interval = interval.getSplitChildAtOpId(op.id(), mode, allocator);
                }
                assert checkState(block, op, inputState, interval.operand, interval.location(), interval.splitParent());
            }
        }
    };
    InstructionValueConsumer defConsumer = (op, operand, mode, flags) -> {
        if (LinearScan.isVariableOrRegister(operand) && allocator.isProcessed(operand)) {
            Interval interval = intervalAt(operand);
            if (op.id() != -1) {
                interval = interval.getSplitChildAtOpId(op.id(), mode, allocator);
            }
            statePut(debug, inputState, interval.location(), interval.splitParent());
        }
    };
    // visit all instructions of the block
    for (int i = 0; i < ops.size(); i++) {
        final LIRInstruction op = ops.get(i);
        if (debug.isLogEnabled()) {
            debug.log("%s", op.toStringWithIdPrefix());
        }
        // check if input operands are correct
        op.visitEachInput(useConsumer);
        // invalidate all caller save registers at calls
        if (op.destroysCallerSavedRegisters()) {
            for (Register r : allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters()) {
                statePut(debug, inputState, r.asValue(), null);
            }
        }
        op.visitEachAlive(useConsumer);
        // set temp operands (some operations use temp operands also as output operands, so
        // can't set them null)
        op.visitEachTemp(defConsumer);
        // set output operands
        op.visitEachOutput(defConsumer);
    }
}
Also used : AbstractBlockBase(org.graalvm.compiler.core.common.cfg.AbstractBlockBase) OperandMode(org.graalvm.compiler.lir.LIRInstruction.OperandMode) LIRInstruction(org.graalvm.compiler.lir.LIRInstruction) Register(jdk.vm.ci.code.Register) ArrayList(java.util.ArrayList) BlockMap(org.graalvm.compiler.core.common.cfg.BlockMap) InstructionValueConsumer(org.graalvm.compiler.lir.InstructionValueConsumer) Value(jdk.vm.ci.meta.Value) OperandFlag(org.graalvm.compiler.lir.LIRInstruction.OperandFlag) DebugContext(org.graalvm.compiler.debug.DebugContext) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) Indent(org.graalvm.compiler.debug.Indent) GraalError(org.graalvm.compiler.debug.GraalError) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) EnumSet(java.util.EnumSet) InstructionValueConsumer(org.graalvm.compiler.lir.InstructionValueConsumer) Register(jdk.vm.ci.code.Register) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) LIRInstruction(org.graalvm.compiler.lir.LIRInstruction) EnumSet(java.util.EnumSet) Value(jdk.vm.ci.meta.Value) DebugContext(org.graalvm.compiler.debug.DebugContext) OperandMode(org.graalvm.compiler.lir.LIRInstruction.OperandMode)

Example 12 with AbstractBlockBase

use of org.graalvm.compiler.core.common.cfg.AbstractBlockBase in project graal by oracle.

the class TraceBuilderPhase method run.

@Override
protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) {
    AbstractBlockBase<?>[] linearScanOrder = lirGenRes.getLIR().linearScanOrder();
    AbstractBlockBase<?> startBlock = linearScanOrder[0];
    LIR lir = lirGenRes.getLIR();
    assert startBlock.equals(lir.getControlFlowGraph().getStartBlock());
    final TraceBuilderResult traceBuilderResult = getTraceBuilderResult(lir, startBlock, linearScanOrder);
    DebugContext debug = lir.getDebug();
    if (debug.isLogEnabled(DebugContext.BASIC_LEVEL)) {
        ArrayList<Trace> traces = traceBuilderResult.getTraces();
        for (int i = 0; i < traces.size(); i++) {
            Trace trace = traces.get(i);
            debug.log(DebugContext.BASIC_LEVEL, "Trace %5d: %s%s", i, trace, isTrivialTrace(lirGenRes.getLIR(), trace) ? " (trivial)" : "");
        }
    }
    TraceStatisticsPrinter.printTraceStatistics(debug, traceBuilderResult, lirGenRes.getCompilationUnitName());
    debug.dump(DebugContext.VERBOSE_LEVEL, traceBuilderResult, "TraceBuilderResult");
    context.contextAdd(traceBuilderResult);
}
Also used : TraceUtil.isTrivialTrace(org.graalvm.compiler.lir.alloc.trace.TraceUtil.isTrivialTrace) Trace(org.graalvm.compiler.core.common.alloc.Trace) LIR(org.graalvm.compiler.lir.LIR) DebugContext(org.graalvm.compiler.debug.DebugContext) TraceBuilderResult(org.graalvm.compiler.core.common.alloc.TraceBuilderResult) AbstractBlockBase(org.graalvm.compiler.core.common.cfg.AbstractBlockBase)

Example 13 with AbstractBlockBase

use of org.graalvm.compiler.core.common.cfg.AbstractBlockBase in project graal by oracle.

the class RegisterVerifier method processOperations.

void processOperations(AbstractBlockBase<?> block, final TraceInterval[] inputState) {
    ArrayList<LIRInstruction> ops = allocator.getLIR().getLIRforBlock(block);
    DebugContext debug = allocator.getDebug();
    InstructionValueConsumer useConsumer = new InstructionValueConsumer() {

        @Override
        public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) {
            // we skip spill moves inserted by the spill position optimization
            if (isVariableOrRegister(operand) && allocator.isProcessed(operand) && op.id() != TraceLinearScanPhase.DOMINATOR_SPILL_MOVE_ID) {
                TraceInterval interval = intervalAt(asVariable(operand));
                if (op.id() != -1) {
                    interval = interval.getSplitChildAtOpId(op.id(), mode);
                }
                assert checkState(block, op, inputState, allocator.getOperand(interval), interval.location(), interval.splitParent());
            }
        }
    };
    InstructionValueConsumer defConsumer = (op, operand, mode, flags) -> {
        if (isVariableOrRegister(operand) && allocator.isProcessed(operand)) {
            TraceInterval interval = intervalAt(asVariable(operand));
            if (op.id() != -1) {
                interval = interval.getSplitChildAtOpId(op.id(), mode);
            }
            statePut(debug, inputState, interval.location(), interval.splitParent());
        }
    };
    // visit all instructions of the block
    for (int i = 0; i < ops.size(); i++) {
        final LIRInstruction op = ops.get(i);
        if (debug.isLogEnabled()) {
            debug.log("%s", op.toStringWithIdPrefix());
        }
        // check if input operands are correct
        op.visitEachInput(useConsumer);
        // invalidate all caller save registers at calls
        if (op.destroysCallerSavedRegisters()) {
            for (Register r : allocator.getRegisterAllocationConfig().getRegisterConfig().getCallerSaveRegisters()) {
                statePut(debug, inputState, r.asValue(), null);
            }
        }
        op.visitEachAlive(useConsumer);
        // set temp operands (some operations use temp operands also as output operands, so
        // can't set them null)
        op.visitEachTemp(defConsumer);
        // set output operands
        op.visitEachOutput(defConsumer);
    }
}
Also used : AbstractBlockBase(org.graalvm.compiler.core.common.cfg.AbstractBlockBase) OperandMode(org.graalvm.compiler.lir.LIRInstruction.OperandMode) Variable(org.graalvm.compiler.lir.Variable) TraceLinearScanPhase.isVariableOrRegister(org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.isVariableOrRegister) TraceLinearScan(org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.TraceLinearScan) LIRValueUtil.asVariable(org.graalvm.compiler.lir.LIRValueUtil.asVariable) LIRInstruction(org.graalvm.compiler.lir.LIRInstruction) Register(jdk.vm.ci.code.Register) ArrayList(java.util.ArrayList) BlockMap(org.graalvm.compiler.core.common.cfg.BlockMap) InstructionValueConsumer(org.graalvm.compiler.lir.InstructionValueConsumer) Value(jdk.vm.ci.meta.Value) OperandFlag(org.graalvm.compiler.lir.LIRInstruction.OperandFlag) DebugContext(org.graalvm.compiler.debug.DebugContext) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) Indent(org.graalvm.compiler.debug.Indent) GraalError(org.graalvm.compiler.debug.GraalError) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) EnumSet(java.util.EnumSet) InstructionValueConsumer(org.graalvm.compiler.lir.InstructionValueConsumer) TraceLinearScanPhase.isVariableOrRegister(org.graalvm.compiler.lir.alloc.trace.lsra.TraceLinearScanPhase.isVariableOrRegister) Register(jdk.vm.ci.code.Register) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) LIRInstruction(org.graalvm.compiler.lir.LIRInstruction) EnumSet(java.util.EnumSet) Value(jdk.vm.ci.meta.Value) DebugContext(org.graalvm.compiler.debug.DebugContext) OperandMode(org.graalvm.compiler.lir.LIRInstruction.OperandMode)

Example 14 with AbstractBlockBase

use of org.graalvm.compiler.core.common.cfg.AbstractBlockBase in project graal by oracle.

the class FixPointIntervalBuilder method build.

/**
 * Builds the lifetime intervals for {@link VirtualStackSlot virtual stack slots}, sets up
 * {@link #stackSlotMap} and returns a set of use positions, i.e. instructions that contain
 * virtual stack slots.
 */
EconomicSet<LIRInstruction> build() {
    Deque<AbstractBlockBase<?>> worklist = new ArrayDeque<>();
    AbstractBlockBase<?>[] blocks = lir.getControlFlowGraph().getBlocks();
    for (int i = blocks.length - 1; i >= 0; i--) {
        worklist.add(blocks[i]);
    }
    for (AbstractBlockBase<?> block : lir.getControlFlowGraph().getBlocks()) {
        liveInMap.put(block, new BitSet(stackSlotMap.length));
    }
    while (!worklist.isEmpty()) {
        AbstractBlockBase<?> block = worklist.poll();
        processBlock(block, worklist);
    }
    return usePos;
}
Also used : BitSet(java.util.BitSet) ArrayDeque(java.util.ArrayDeque) AbstractBlockBase(org.graalvm.compiler.core.common.cfg.AbstractBlockBase)

Example 15 with AbstractBlockBase

use of org.graalvm.compiler.core.common.cfg.AbstractBlockBase in project graal by oracle.

the class CFGPrinterObserver method dumpSandboxed.

public void dumpSandboxed(DebugContext debug, Object object, String message) {
    OptionValues options = debug.getOptions();
    boolean dumpFrontend = PrintCFG.getValue(options);
    if (!dumpFrontend && isFrontendObject(object)) {
        return;
    }
    if (cfgPrinter == null) {
        try {
            Path dumpFile = debug.getDumpPath(".cfg", false);
            cfgFile = dumpFile.toFile();
            OutputStream out = new BufferedOutputStream(new FileOutputStream(cfgFile));
            cfgPrinter = new CFGPrinter(out);
        } catch (IOException e) {
            throw (GraalError) new GraalError("Could not open %s", cfgFile == null ? "[null]" : cfgFile.getAbsolutePath()).initCause(e);
        }
    }
    if (!checkMethodScope(debug)) {
        return;
    }
    try {
        if (curMethod instanceof ResolvedJavaMethod) {
            cfgPrinter.method = (ResolvedJavaMethod) curMethod;
        }
        if (object instanceof LIR) {
            cfgPrinter.lir = (LIR) object;
        } else {
            cfgPrinter.lir = debug.contextLookup(LIR.class);
        }
        cfgPrinter.nodeLirGenerator = debug.contextLookup(NodeLIRBuilder.class);
        cfgPrinter.livenessInfo = debug.contextLookup(GlobalLivenessInfo.class);
        cfgPrinter.res = debug.contextLookup(LIRGenerationResult.class);
        if (cfgPrinter.nodeLirGenerator != null) {
            cfgPrinter.target = cfgPrinter.nodeLirGenerator.getLIRGeneratorTool().target();
        }
        if (cfgPrinter.lir != null && cfgPrinter.lir.getControlFlowGraph() instanceof ControlFlowGraph) {
            cfgPrinter.cfg = (ControlFlowGraph) cfgPrinter.lir.getControlFlowGraph();
        }
        CodeCacheProvider codeCache = debug.contextLookup(CodeCacheProvider.class);
        if (codeCache != null) {
            cfgPrinter.target = codeCache.getTarget();
        }
        if (object instanceof BciBlockMapping) {
            BciBlockMapping blockMap = (BciBlockMapping) object;
            cfgPrinter.printCFG(message, blockMap);
            if (blockMap.code.getCode() != null) {
                cfgPrinter.printBytecodes(new BytecodeDisassembler(false).disassemble(blockMap.code));
            }
        } else if (object instanceof LIR) {
            // Currently no node printing for lir
            cfgPrinter.printCFG(message, cfgPrinter.lir.codeEmittingOrder(), false);
            lastLIR = (LIR) object;
            if (delayedIntervals != null) {
                cfgPrinter.printIntervals(message, delayedIntervals);
                delayedIntervals = null;
            }
        } else if (object instanceof ScheduleResult) {
            cfgPrinter.printSchedule(message, (ScheduleResult) object);
        } else if (object instanceof StructuredGraph) {
            if (cfgPrinter.cfg == null) {
                StructuredGraph graph = (StructuredGraph) object;
                cfgPrinter.cfg = ControlFlowGraph.compute(graph, true, true, true, false);
                cfgPrinter.printCFG(message, cfgPrinter.cfg.getBlocks(), true);
            } else {
                cfgPrinter.printCFG(message, cfgPrinter.cfg.getBlocks(), true);
            }
        } else if (object instanceof CompilationResult) {
            final CompilationResult compResult = (CompilationResult) object;
            cfgPrinter.printMachineCode(disassemble(codeCache, compResult, null), message);
        } else if (object instanceof InstalledCode) {
            CompilationResult compResult = debug.contextLookup(CompilationResult.class);
            if (compResult != null) {
                cfgPrinter.printMachineCode(disassemble(codeCache, compResult, (InstalledCode) object), message);
            }
        } else if (object instanceof IntervalDumper) {
            if (lastLIR == cfgPrinter.lir) {
                cfgPrinter.printIntervals(message, (IntervalDumper) object);
            } else {
                if (delayedIntervals != null) {
                    debug.log("Some delayed intervals were dropped (%s)", delayedIntervals);
                }
                delayedIntervals = (IntervalDumper) object;
            }
        } else if (object instanceof AbstractBlockBase<?>[]) {
            cfgPrinter.printCFG(message, (AbstractBlockBase<?>[]) object, false);
        } else if (object instanceof Trace) {
            cfgPrinter.printCFG(message, ((Trace) object).getBlocks(), false);
        } else if (object instanceof TraceBuilderResult) {
            cfgPrinter.printTraces(message, (TraceBuilderResult) object);
        }
    } finally {
        cfgPrinter.target = null;
        cfgPrinter.lir = null;
        cfgPrinter.res = null;
        cfgPrinter.nodeLirGenerator = null;
        cfgPrinter.livenessInfo = null;
        cfgPrinter.cfg = null;
        cfgPrinter.flush();
    }
}
Also used : BytecodeDisassembler(org.graalvm.compiler.bytecode.BytecodeDisassembler) IntervalDumper(org.graalvm.compiler.lir.debug.IntervalDumper) ScheduleResult(org.graalvm.compiler.nodes.StructuredGraph.ScheduleResult) OptionValues(org.graalvm.compiler.options.OptionValues) BufferedOutputStream(java.io.BufferedOutputStream) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) CodeCacheProvider(jdk.vm.ci.code.CodeCacheProvider) AbstractBlockBase(org.graalvm.compiler.core.common.cfg.AbstractBlockBase) LIRGenerationResult(org.graalvm.compiler.lir.gen.LIRGenerationResult) GraalError(org.graalvm.compiler.debug.GraalError) StructuredGraph(org.graalvm.compiler.nodes.StructuredGraph) InstalledCode(jdk.vm.ci.code.InstalledCode) TraceBuilderResult(org.graalvm.compiler.core.common.alloc.TraceBuilderResult) BufferedOutputStream(java.io.BufferedOutputStream) Path(java.nio.file.Path) BciBlockMapping(org.graalvm.compiler.java.BciBlockMapping) GlobalLivenessInfo(org.graalvm.compiler.lir.alloc.trace.GlobalLivenessInfo) IOException(java.io.IOException) Trace(org.graalvm.compiler.core.common.alloc.Trace) LIR(org.graalvm.compiler.lir.LIR) FileOutputStream(java.io.FileOutputStream) ControlFlowGraph(org.graalvm.compiler.nodes.cfg.ControlFlowGraph) NodeLIRBuilder(org.graalvm.compiler.core.gen.NodeLIRBuilder) CompilationResult(org.graalvm.compiler.code.CompilationResult) ResolvedJavaMethod(jdk.vm.ci.meta.ResolvedJavaMethod)

Aggregations

AbstractBlockBase (org.graalvm.compiler.core.common.cfg.AbstractBlockBase)15 Indent (org.graalvm.compiler.debug.Indent)11 DebugContext (org.graalvm.compiler.debug.DebugContext)9 ArrayDeque (java.util.ArrayDeque)7 GraalError (org.graalvm.compiler.debug.GraalError)7 LIRInstruction (org.graalvm.compiler.lir.LIRInstruction)7 ArrayList (java.util.ArrayList)6 Value (jdk.vm.ci.meta.Value)6 LIRGenerationResult (org.graalvm.compiler.lir.gen.LIRGenerationResult)6 BitSet (java.util.BitSet)5 EnumSet (java.util.EnumSet)5 Register (jdk.vm.ci.code.Register)5 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)5 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)5 InstructionValueConsumer (org.graalvm.compiler.lir.InstructionValueConsumer)5 OperandFlag (org.graalvm.compiler.lir.LIRInstruction.OperandFlag)5 OperandMode (org.graalvm.compiler.lir.LIRInstruction.OperandMode)5 StackSlot (jdk.vm.ci.code.StackSlot)4 TargetDescription (jdk.vm.ci.code.TargetDescription)4 AllocatableValue (jdk.vm.ci.meta.AllocatableValue)4