Search in sources :

Example 1 with SaveRegistersOp

use of org.graalvm.compiler.lir.StandardOp.SaveRegistersOp in project graal by oracle.

the class HotSpotZapRegistersPhase method processBlock.

@SuppressWarnings("try")
private static void processBlock(DiagnosticLIRGeneratorTool diagnosticLirGenTool, HotSpotLIRGenerationResult res, LIR lir, LIRInsertionBuffer buffer, AbstractBlockBase<?> block, boolean zapRegisters, boolean zapStack) {
    DebugContext debug = lir.getDebug();
    try (Indent indent = debug.logAndIndent("Process block %s", block)) {
        ArrayList<LIRInstruction> instructions = lir.getLIRforBlock(block);
        buffer.init(instructions);
        for (int index = 0; index < instructions.size(); index++) {
            LIRInstruction inst = instructions.get(index);
            if (zapStack && inst instanceof ZapStackArgumentSpaceBeforeInstruction) {
                LIRInstruction zap = diagnosticLirGenTool.zapArgumentSpace();
                if (zap != null) {
                    buffer.append(index, zap);
                }
            }
            if (zapRegisters && inst instanceof ZapRegistersAfterInstruction) {
                LIRFrameState state = getLIRState(inst);
                if (state != null) {
                    SaveRegistersOp zap = diagnosticLirGenTool.createZapRegisters();
                    SaveRegistersOp old = res.getCalleeSaveInfo().put(state, zap);
                    assert old == null : "Already another SaveRegisterOp registered! " + old;
                    buffer.append(index + 1, (LIRInstruction) zap);
                    debug.log("Insert ZapRegister after %s", inst);
                }
            }
        }
        buffer.finish();
    }
}
Also used : LIRFrameState(org.graalvm.compiler.lir.LIRFrameState) Indent(org.graalvm.compiler.debug.Indent) ZapRegistersAfterInstruction(org.graalvm.compiler.lir.gen.DiagnosticLIRGeneratorTool.ZapRegistersAfterInstruction) ZapStackArgumentSpaceBeforeInstruction(org.graalvm.compiler.lir.gen.DiagnosticLIRGeneratorTool.ZapStackArgumentSpaceBeforeInstruction) LIRInstruction(org.graalvm.compiler.lir.LIRInstruction) DebugContext(org.graalvm.compiler.debug.DebugContext) SaveRegistersOp(org.graalvm.compiler.lir.StandardOp.SaveRegistersOp)

Example 2 with SaveRegistersOp

use of org.graalvm.compiler.lir.StandardOp.SaveRegistersOp in project graal by oracle.

the class SPARCHotSpotBackend method newCompilationResultBuilder.

@Override
public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, FrameMap frameMap, CompilationResult compilationResult, CompilationResultBuilderFactory factory) {
    HotSpotLIRGenerationResult gen = (HotSpotLIRGenerationResult) lirGenRes;
    LIR lir = gen.getLIR();
    assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame";
    Stub stub = gen.getStub();
    Assembler masm = createAssembler(frameMap);
    // On SPARC we always use stack frames.
    HotSpotFrameContext frameContext = new HotSpotFrameContext(stub != null);
    DataBuilder dataBuilder = new HotSpotDataBuilder(getCodeCache().getTarget());
    OptionValues options = lir.getOptions();
    DebugContext debug = lir.getDebug();
    CompilationResultBuilder crb = factory.createBuilder(getProviders().getCodeCache(), getProviders().getForeignCalls(), frameMap, masm, dataBuilder, frameContext, options, debug, compilationResult);
    crb.setTotalFrameSize(frameMap.totalFrameSize());
    crb.setMaxInterpreterFrameSize(gen.getMaxInterpreterFrameSize());
    StackSlot deoptimizationRescueSlot = gen.getDeoptimizationRescueSlot();
    if (deoptimizationRescueSlot != null && stub == null) {
        crb.compilationResult.setCustomStackAreaOffset(deoptimizationRescueSlot);
    }
    if (stub != null) {
        // Even on sparc we need to save floating point registers
        EconomicSet<Register> destroyedCallerRegisters = gatherDestroyedCallerRegisters(lir);
        EconomicMap<LIRFrameState, SaveRegistersOp> calleeSaveInfo = gen.getCalleeSaveInfo();
        updateStub(stub, destroyedCallerRegisters, calleeSaveInfo, frameMap);
    }
    assert registerSizePredictionValidator(crb, debug);
    return crb;
}
Also used : LIRFrameState(org.graalvm.compiler.lir.LIRFrameState) OptionValues(org.graalvm.compiler.options.OptionValues) HotSpotLIRGenerationResult(org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult) HotSpotDataBuilder(org.graalvm.compiler.hotspot.HotSpotDataBuilder) Stub(org.graalvm.compiler.hotspot.stubs.Stub) StackSlot(jdk.vm.ci.code.StackSlot) DebugContext(org.graalvm.compiler.debug.DebugContext) CompilationResultBuilder(org.graalvm.compiler.lir.asm.CompilationResultBuilder) LIR(org.graalvm.compiler.lir.LIR) HotSpotDataBuilder(org.graalvm.compiler.hotspot.HotSpotDataBuilder) DataBuilder(org.graalvm.compiler.lir.asm.DataBuilder) Register(jdk.vm.ci.code.Register) ValueUtil.isRegister(jdk.vm.ci.code.ValueUtil.isRegister) ValueUtil.asRegister(jdk.vm.ci.code.ValueUtil.asRegister) ScratchRegister(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister) SPARCAssembler.isGlobalRegister(org.graalvm.compiler.asm.sparc.SPARCAssembler.isGlobalRegister) SPARCAssembler(org.graalvm.compiler.asm.sparc.SPARCAssembler) SPARCMacroAssembler(org.graalvm.compiler.asm.sparc.SPARCMacroAssembler) Assembler(org.graalvm.compiler.asm.Assembler) SaveRegistersOp(org.graalvm.compiler.lir.StandardOp.SaveRegistersOp)

Example 3 with SaveRegistersOp

use of org.graalvm.compiler.lir.StandardOp.SaveRegistersOp in project graal by oracle.

the class HotSpotBackend method updateStub.

/**
 * Updates a given stub with respect to the registers it destroys.
 * <p>
 * Any entry in {@code calleeSaveInfo} that {@linkplain SaveRegistersOp#supportsRemove()
 * supports} pruning will have {@code destroyedRegisters}
 * {@linkplain SaveRegistersOp#remove(EconomicSet) removed} as these registers are declared as
 * temporaries in the stub's {@linkplain ForeignCallLinkage linkage} (and thus will be saved by
 * the stub's caller).
 *
 * @param stub the stub to update
 * @param destroyedRegisters the registers destroyed by the stub
 * @param calleeSaveInfo a map from debug infos to the operations that provide their
 *            {@linkplain RegisterSaveLayout callee-save information}
 * @param frameMap used to {@linkplain FrameMap#offsetForStackSlot(StackSlot) convert} a virtual
 *            slot to a frame slot index
 */
protected void updateStub(Stub stub, EconomicSet<Register> destroyedRegisters, EconomicMap<LIRFrameState, SaveRegistersOp> calleeSaveInfo, FrameMap frameMap) {
    stub.initDestroyedCallerRegisters(destroyedRegisters);
    MapCursor<LIRFrameState, SaveRegistersOp> cursor = calleeSaveInfo.getEntries();
    while (cursor.advance()) {
        SaveRegistersOp save = cursor.getValue();
        if (save.supportsRemove()) {
            save.remove(destroyedRegisters);
        }
        if (cursor.getKey() != LIRFrameState.NO_STATE) {
            cursor.getKey().debugInfo().setCalleeSaveInfo(save.getMap(frameMap));
        }
    }
}
Also used : LIRFrameState(org.graalvm.compiler.lir.LIRFrameState) SaveRegistersOp(org.graalvm.compiler.lir.StandardOp.SaveRegistersOp)

Aggregations

LIRFrameState (org.graalvm.compiler.lir.LIRFrameState)3 SaveRegistersOp (org.graalvm.compiler.lir.StandardOp.SaveRegistersOp)3 DebugContext (org.graalvm.compiler.debug.DebugContext)2 Register (jdk.vm.ci.code.Register)1 StackSlot (jdk.vm.ci.code.StackSlot)1 ValueUtil.asRegister (jdk.vm.ci.code.ValueUtil.asRegister)1 ValueUtil.isRegister (jdk.vm.ci.code.ValueUtil.isRegister)1 Assembler (org.graalvm.compiler.asm.Assembler)1 SPARCAssembler (org.graalvm.compiler.asm.sparc.SPARCAssembler)1 SPARCAssembler.isGlobalRegister (org.graalvm.compiler.asm.sparc.SPARCAssembler.isGlobalRegister)1 SPARCMacroAssembler (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler)1 ScratchRegister (org.graalvm.compiler.asm.sparc.SPARCMacroAssembler.ScratchRegister)1 Indent (org.graalvm.compiler.debug.Indent)1 HotSpotDataBuilder (org.graalvm.compiler.hotspot.HotSpotDataBuilder)1 HotSpotLIRGenerationResult (org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult)1 Stub (org.graalvm.compiler.hotspot.stubs.Stub)1 LIR (org.graalvm.compiler.lir.LIR)1 LIRInstruction (org.graalvm.compiler.lir.LIRInstruction)1 CompilationResultBuilder (org.graalvm.compiler.lir.asm.CompilationResultBuilder)1 DataBuilder (org.graalvm.compiler.lir.asm.DataBuilder)1