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();
}
}
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;
}
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));
}
}
}
Aggregations