# HG changeset patch # User Josef Eisl # Date 1432736770 -7200 # Node ID 47a3d4b3ccb345f81fcf3ac44148ae61fa14d7b4 # Parent 3de3699ecac1a330487364903e811be00782ae4d AMD64HotSpotEpilogueOp: set rbp rescue location on construction. diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Wed May 27 16:26:10 2015 +0200 @@ -29,6 +29,7 @@ import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.amd64.*; import com.oracle.graal.lir.asm.*; +import com.oracle.jvmci.meta.*; /** * Removes the current frame and tail calls the uncommon trap routine. @@ -38,8 +39,8 @@ public static final LIRInstructionClass TYPE = LIRInstructionClass.create(AMD64HotSpotDeoptimizeCallerOp.class); - protected AMD64HotSpotDeoptimizeCallerOp() { - super(TYPE); + protected AMD64HotSpotDeoptimizeCallerOp(AllocatableValue savedRbp) { + super(TYPE, savedRbp); } @Override diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Wed May 27 16:26:10 2015 +0200 @@ -22,36 +22,28 @@ */ package com.oracle.graal.hotspot.amd64; -import com.oracle.jvmci.code.Register; -import com.oracle.jvmci.meta.LIRKind; -import com.oracle.jvmci.meta.AllocatableValue; -import com.oracle.jvmci.meta.Kind; import static com.oracle.graal.amd64.AMD64.*; +import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; import static com.oracle.jvmci.code.ValueUtil.*; -import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; import com.oracle.graal.asm.amd64.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.amd64.*; import com.oracle.graal.lir.asm.*; +import com.oracle.jvmci.code.*; +import com.oracle.jvmci.meta.*; /** * Superclass for operations that use the value of RBP saved in a method's prologue. */ abstract class AMD64HotSpotEpilogueOp extends AMD64LIRInstruction { - protected AMD64HotSpotEpilogueOp(LIRInstructionClass c) { + protected AMD64HotSpotEpilogueOp(LIRInstructionClass c, AllocatableValue savedRbp) { super(c); + this.savedRbp = savedRbp; } - /** - * The type of location (i.e., stack or register) in which RBP is saved is not known until - * initial LIR generation is finished. Until then, we use a placeholder variable so that LIR - * verification is successful. - */ - private static final Variable PLACEHOLDER = new Variable(LIRKind.value(Kind.Long), Integer.MAX_VALUE); - - @Use({REG, STACK}) protected AllocatableValue savedRbp = PLACEHOLDER; + @Use({REG, STACK}) private AllocatableValue savedRbp; protected void leaveFrameAndRestoreRbp(CompilationResultBuilder crb, AMD64MacroAssembler masm) { if (isStackSlot(savedRbp)) { diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java Wed May 27 16:26:10 2015 +0200 @@ -49,8 +49,9 @@ private final Register thread; private final int isMethodHandleReturnOffset; - AMD64HotSpotJumpToExceptionHandlerInCallerOp(AllocatableValue handlerInCallerPc, AllocatableValue exception, AllocatableValue exceptionPc, int isMethodHandleReturnOffset, Register thread) { - super(TYPE); + AMD64HotSpotJumpToExceptionHandlerInCallerOp(AllocatableValue handlerInCallerPc, AllocatableValue exception, AllocatableValue exceptionPc, int isMethodHandleReturnOffset, Register thread, + AllocatableValue savedRbp) { + super(TYPE, savedRbp); this.handlerInCallerPc = handlerInCallerPc; this.exception = exception; this.exceptionPc = exceptionPc; diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Wed May 27 16:26:10 2015 +0200 @@ -99,44 +99,63 @@ */ class SaveRbp { - final NoOp placeholder; + private final NoOp placeholder0; + private final NoOp placeholder1; /** * The slot reserved for saving RBP. */ - final StackSlot reservedSlot; + private final StackSlot reservedSlot; + /** + * The variable reserved for saving RBP. + * + * This should be either allocated to RBP, or to reserved stack slot. + */ + private final AllocatableValue rescueSlot; - public SaveRbp(NoOp placeholder) { - this.placeholder = placeholder; + public SaveRbp(NoOp placeholder0, NoOp placeholder1) { + this.placeholder0 = placeholder0; + this.placeholder1 = placeholder1; AMD64FrameMapBuilder frameMapBuilder = (AMD64FrameMapBuilder) getResult().getFrameMapBuilder(); this.reservedSlot = frameMapBuilder.allocateRBPSpillSlot(); + this.rescueSlot = newVariable(LIRKind.value(Kind.Long)); } /** * Replaces this operation with the appropriate move for saving rbp. * * @param useStack specifies if rbp must be saved to the stack + * @return true if an instruction has been remove (i.e. replace by {@code null}). */ - public AllocatableValue finalize(boolean useStack) { - AllocatableValue dst; + public boolean finalize(boolean useStack) { + // move to variable + placeholder0.replace(getResult().getLIR(), new MoveFromRegOp(Kind.Long, rescueSlot, rbp.asValue(LIRKind.value(Kind.Long)))); + // move to stack + MoveFromRegOp moveToStack; if (useStack) { - dst = reservedSlot; + moveToStack = new MoveFromRegOp(Kind.Long, reservedSlot, rescueSlot); } else { ((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).freeRBPSpillSlot(); - dst = newVariable(LIRKind.value(Kind.Long)); + moveToStack = null; } + placeholder1.replace(getResult().getLIR(), moveToStack); + return moveToStack == null; - placeholder.replace(getResult().getLIR(), new MoveFromRegOp(Kind.Long, dst, rbp.asValue(LIRKind.value(Kind.Long)))); - return dst; + } + + AllocatableValue getRbpRescueSlot() { + return rescueSlot; } } private SaveRbp saveRbp; protected void emitSaveRbp() { - NoOp placeholder = new NoOp(getCurrentBlock(), getResult().getLIR().getLIRforBlock(getCurrentBlock()).size()); - append(placeholder); - saveRbp = new SaveRbp(placeholder); + NoOp placeholder0 = new NoOp(getCurrentBlock(), getResult().getLIR().getLIRforBlock(getCurrentBlock()).size()); + append(placeholder0); + NoOp placeholder1 = new NoOp(getCurrentBlock(), getResult().getLIR().getLIRforBlock(getCurrentBlock()).size()); + append(placeholder1); + saveRbp = new SaveRbp(placeholder0, placeholder1); } protected SaveRbp getSaveRbp() { @@ -182,20 +201,6 @@ return rescueSlotOp; } - /** - * List of epilogue operations that need to restore RBP. - */ - List epilogueOps = new ArrayList<>(2); - - @Override - public I append(I op) { - I ret = super.append(op); - if (op instanceof AMD64HotSpotEpilogueOp) { - epilogueOps.add((AMD64HotSpotEpilogueOp) op); - } - return ret; - } - @Override public StackSlotValue getLockSlot(int lockDepth) { return getLockStack().makeLockSlot(lockDepth); @@ -233,7 +238,7 @@ if (pollOnReturnScratchRegister == null) { pollOnReturnScratchRegister = findPollOnReturnScratchRegister(); } - append(new AMD64HotSpotReturnOp(operand, getStub() != null, pollOnReturnScratchRegister, config)); + append(new AMD64HotSpotReturnOp(operand, getStub() != null, pollOnReturnScratchRegister, config, saveRbp.getRbpRescueSlot())); } @Override @@ -256,13 +261,13 @@ } public void emitLeaveCurrentStackFrame(SaveRegistersOp saveRegisterOp) { - append(new AMD64HotSpotLeaveCurrentStackFrameOp(saveRegisterOp)); + append(new AMD64HotSpotLeaveCurrentStackFrameOp(saveRegisterOp, saveRbp.getRbpRescueSlot())); } public void emitLeaveDeoptimizedStackFrame(Value frameSize, Value initialInfo) { Variable frameSizeVariable = load(frameSize); Variable initialInfoVariable = load(initialInfo); - append(new AMD64HotSpotLeaveDeoptimizedStackFrameOp(frameSizeVariable, initialInfoVariable)); + append(new AMD64HotSpotLeaveDeoptimizedStackFrameOp(frameSizeVariable, initialInfoVariable, saveRbp.getRbpRescueSlot())); } public void emitEnterUnpackFramesStackFrame(Value framePc, Value senderSp, Value senderFp, SaveRegistersOp saveRegisterOp) { @@ -465,7 +470,7 @@ assert outgoingCc.getArgumentCount() == 2; RegisterValue exceptionParameter = (RegisterValue) outgoingCc.getArgument(0); emitMove(exceptionParameter, exception); - append(new AMD64HotSpotUnwindOp(exceptionParameter)); + append(new AMD64HotSpotUnwindOp(exceptionParameter, saveRbp.getRbpRescueSlot())); } private void moveDeoptValuesToThread(Value actionAndReason, Value speculation) { @@ -489,21 +494,18 @@ @Override public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) { moveDeoptValuesToThread(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0), JavaConstant.NULL_POINTER); - append(new AMD64HotSpotDeoptimizeCallerOp()); + append(new AMD64HotSpotDeoptimizeCallerOp(saveRbp.getRbpRescueSlot())); } @Override public void beforeRegisterAllocation() { super.beforeRegisterAllocation(); boolean hasDebugInfo = getResult().getLIR().hasDebugInfo(); - AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo); + boolean removedInstruction = saveRbp.finalize(hasDebugInfo); if (hasDebugInfo) { ((AMD64HotSpotLIRGenerationResult) getResult()).setDeoptimizationRescueSlot(((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).allocateDeoptimizationRescueSlot()); } - for (AMD64HotSpotEpilogueOp op : epilogueOps) { - op.savedRbp = savedRbp; - } if (BenchmarkCounters.enabled) { // ensure that the rescue slot is available LIRInstruction op = getOrInitRescueSlotOp(); @@ -513,6 +515,12 @@ instructions.add(1, op); Debug.dump(lir, "created rescue dummy op"); } + if (removedInstruction) { + // remove null from instruction list + LIR lir = getResult().getLIR(); + List instructions = lir.getLIRforBlock(lir.getControlFlowGraph().getStartBlock()); + instructions.remove(null); + } } public void emitPushInterpreterFrame(Value frameSize, Value framePc, Value senderSp, Value initialInfo) { diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java Wed May 27 16:26:10 2015 +0200 @@ -22,10 +22,6 @@ */ package com.oracle.graal.hotspot.amd64; -import com.oracle.jvmci.code.Register; -import com.oracle.jvmci.code.RegisterConfig; -import com.oracle.jvmci.code.RegisterSaveLayout; -import com.oracle.jvmci.meta.Kind; import static com.oracle.graal.amd64.AMD64.*; import com.oracle.graal.asm.amd64.*; @@ -33,6 +29,8 @@ import com.oracle.graal.lir.StandardOp.SaveRegistersOp; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.framemap.*; +import com.oracle.jvmci.code.*; +import com.oracle.jvmci.meta.*; /** * Pops the current frame off the stack including the return address and restores the return @@ -45,8 +43,8 @@ private final SaveRegistersOp saveRegisterOp; - public AMD64HotSpotLeaveCurrentStackFrameOp(SaveRegistersOp saveRegisterOp) { - super(TYPE); + public AMD64HotSpotLeaveCurrentStackFrameOp(SaveRegistersOp saveRegisterOp, AllocatableValue savedRbp) { + super(TYPE, savedRbp); this.saveRegisterOp = saveRegisterOp; } diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java Wed May 27 16:26:10 2015 +0200 @@ -42,8 +42,8 @@ @Use(REG) AllocatableValue frameSize; @Use(REG) AllocatableValue framePointer; - public AMD64HotSpotLeaveDeoptimizedStackFrameOp(AllocatableValue frameSize, AllocatableValue initialInfo) { - super(TYPE); + public AMD64HotSpotLeaveDeoptimizedStackFrameOp(AllocatableValue frameSize, AllocatableValue initialInfo, AllocatableValue savedRbp) { + super(TYPE, savedRbp); this.frameSize = frameSize; this.framePointer = initialInfo; } diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Wed May 27 16:26:10 2015 +0200 @@ -186,7 +186,7 @@ gen.emitMove(exceptionPcFixed, operand(exceptionPc)); Register thread = getGen().getProviders().getRegisters().getThreadRegister(); AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, getGen().config.threadIsMethodHandleReturnOffset, - thread); + thread, getGen().getSaveRbp().getRbpRescueSlot()); append(op); } diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Wed May 27 16:26:10 2015 +0200 @@ -22,15 +22,15 @@ */ package com.oracle.graal.hotspot.amd64; -import com.oracle.jvmci.code.Register; -import com.oracle.jvmci.meta.Value; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; import com.oracle.graal.asm.amd64.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.asm.*; +import com.oracle.jvmci.code.*; import com.oracle.jvmci.hotspot.*; +import com.oracle.jvmci.meta.*; /** * Returns from a function. @@ -44,8 +44,8 @@ private final Register scratchForSafepointOnReturn; private final HotSpotVMConfig config; - AMD64HotSpotReturnOp(Value value, boolean isStub, Register scratchForSafepointOnReturn, HotSpotVMConfig config) { - super(TYPE); + AMD64HotSpotReturnOp(Value value, boolean isStub, Register scratchForSafepointOnReturn, HotSpotVMConfig config, AllocatableValue savedRbp) { + super(TYPE, savedRbp); this.value = value; this.isStub = isStub; this.scratchForSafepointOnReturn = scratchForSafepointOnReturn; diff -r 3de3699ecac1 -r 47a3d4b3ccb3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotUnwindOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotUnwindOp.java Wed May 27 15:46:11 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotUnwindOp.java Wed May 27 16:26:10 2015 +0200 @@ -22,14 +22,10 @@ */ package com.oracle.graal.hotspot.amd64; -import com.oracle.jvmci.code.RegisterValue; -import com.oracle.jvmci.code.Register; -import com.oracle.jvmci.code.ForeignCallLinkage; -import com.oracle.jvmci.code.CallingConvention; import static com.oracle.graal.amd64.AMD64.*; -import static com.oracle.jvmci.code.ValueUtil.*; import static com.oracle.graal.hotspot.HotSpotBackend.*; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; +import static com.oracle.jvmci.code.ValueUtil.*; import com.oracle.graal.asm.amd64.*; import com.oracle.graal.hotspot.stubs.*; @@ -37,6 +33,8 @@ import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.amd64.*; import com.oracle.graal.lir.asm.*; +import com.oracle.jvmci.code.*; +import com.oracle.jvmci.meta.*; /** * Removes the current frame and jumps to the {@link UnwindExceptionToCallerStub}. @@ -47,8 +45,8 @@ @Use({REG}) protected RegisterValue exception; - AMD64HotSpotUnwindOp(RegisterValue exception) { - super(TYPE); + AMD64HotSpotUnwindOp(RegisterValue exception, AllocatableValue savedRbp) { + super(TYPE, savedRbp); this.exception = exception; }