Mercurial > hg > graal-compiler
changeset 22658:d08945fe8cb4
Backout 47a3d4b3ccb3 (AMD64HotSpotEpilogueOp: set rbp rescue location on construction.)
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotDeoptimizeCallerOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.hotspot.amd64; import static com.oracle.graal.hotspot.HotSpotHostBackend.UNCOMMON_TRAP_HANDLER; -import jdk.internal.jvmci.meta.AllocatableValue; import com.oracle.graal.asm.amd64.AMD64MacroAssembler; import com.oracle.graal.lir.LIRInstructionClass; @@ -39,8 +38,8 @@ public static final LIRInstructionClass<AMD64HotSpotDeoptimizeCallerOp> TYPE = LIRInstructionClass.create(AMD64HotSpotDeoptimizeCallerOp.class); - protected AMD64HotSpotDeoptimizeCallerOp(AllocatableValue savedRbp) { - super(TYPE, savedRbp); + protected AMD64HotSpotDeoptimizeCallerOp() { + super(TYPE); } @Override
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueBlockEndOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -25,9 +25,12 @@ import static com.oracle.graal.lir.LIRInstruction.OperandFlag.REG; import static com.oracle.graal.lir.LIRInstruction.OperandFlag.STACK; import jdk.internal.jvmci.meta.AllocatableValue; +import jdk.internal.jvmci.meta.JavaKind; +import jdk.internal.jvmci.meta.LIRKind; import com.oracle.graal.asm.amd64.AMD64MacroAssembler; import com.oracle.graal.lir.LIRInstructionClass; +import com.oracle.graal.lir.Variable; import com.oracle.graal.lir.amd64.AMD64BlockEndOp; import com.oracle.graal.lir.asm.CompilationResultBuilder; @@ -36,12 +39,18 @@ */ abstract class AMD64HotSpotEpilogueBlockEndOp extends AMD64BlockEndOp { - protected AMD64HotSpotEpilogueBlockEndOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueBlockEndOp> c, AllocatableValue savedRbp) { + protected AMD64HotSpotEpilogueBlockEndOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueBlockEndOp> c) { super(c); - this.savedRbp = savedRbp; } - @Use({REG, STACK}) private AllocatableValue 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(JavaKind.Long), Integer.MAX_VALUE); + + @Use({REG, STACK}) protected AllocatableValue savedRbp = PLACEHOLDER; protected void leaveFrameAndRestoreRbp(CompilationResultBuilder crb, AMD64MacroAssembler masm) { AMD64HotSpotEpilogueOp.leaveFrameAndRestoreRbp(savedRbp, crb, masm);
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotEpilogueOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -29,10 +29,13 @@ import static jdk.internal.jvmci.code.ValueUtil.isStackSlot; import jdk.internal.jvmci.code.Register; import jdk.internal.jvmci.meta.AllocatableValue; +import jdk.internal.jvmci.meta.JavaKind; +import jdk.internal.jvmci.meta.LIRKind; import com.oracle.graal.asm.amd64.AMD64Address; import com.oracle.graal.asm.amd64.AMD64MacroAssembler; import com.oracle.graal.lir.LIRInstructionClass; +import com.oracle.graal.lir.Variable; import com.oracle.graal.lir.amd64.AMD64LIRInstruction; import com.oracle.graal.lir.asm.CompilationResultBuilder; @@ -41,12 +44,18 @@ */ abstract class AMD64HotSpotEpilogueOp extends AMD64LIRInstruction { - protected AMD64HotSpotEpilogueOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueOp> c, AllocatableValue savedRbp) { + protected AMD64HotSpotEpilogueOp(LIRInstructionClass<? extends AMD64HotSpotEpilogueOp> c) { super(c); - this.savedRbp = savedRbp; } - @Use({REG, STACK}) private AllocatableValue 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(JavaKind.Long), Integer.MAX_VALUE); + + @Use({REG, STACK}) protected AllocatableValue savedRbp = PLACEHOLDER; protected void leaveFrameAndRestoreRbp(CompilationResultBuilder crb, AMD64MacroAssembler masm) { leaveFrameAndRestoreRbp(savedRbp, crb, masm);
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotJumpToExceptionHandlerInCallerOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -51,9 +51,8 @@ private final Register thread; private final int isMethodHandleReturnOffset; - AMD64HotSpotJumpToExceptionHandlerInCallerOp(AllocatableValue handlerInCallerPc, AllocatableValue exception, AllocatableValue exceptionPc, int isMethodHandleReturnOffset, Register thread, - AllocatableValue savedRbp) { - super(TYPE, savedRbp); + AMD64HotSpotJumpToExceptionHandlerInCallerOp(AllocatableValue handlerInCallerPc, AllocatableValue exception, AllocatableValue exceptionPc, int isMethodHandleReturnOffset, Register thread) { + super(TYPE); this.handlerInCallerPc = handlerInCallerPc; this.exception = exception; this.exceptionPc = exceptionPc;
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Fri Sep 18 15:09:46 2015 +0200 @@ -33,6 +33,7 @@ import static jdk.internal.jvmci.amd64.AMD64.cpuxmmRegisters; import static jdk.internal.jvmci.amd64.AMD64.rbp; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -75,7 +76,6 @@ import com.oracle.graal.hotspot.HotSpotForeignCallLinkage; import com.oracle.graal.hotspot.HotSpotLIRGenerator; import com.oracle.graal.hotspot.HotSpotLockStack; -import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.StoreRbpOp; import com.oracle.graal.hotspot.debug.BenchmarkCounters; import com.oracle.graal.hotspot.meta.HotSpotProviders; import com.oracle.graal.hotspot.stubs.Stub; @@ -133,24 +133,17 @@ */ class SaveRbp { - private final NoOp placeholder; + final NoOp placeholder; /** * The slot reserved for saving RBP. */ - private final StackSlot reservedSlot; - /** - * The variable reserved for saving RBP. - * - * This should be either allocated to RBP, or to {@link #reservedSlot}. - */ - private final AllocatableValue rescueSlot; + final StackSlot reservedSlot; - public SaveRbp(NoOp placeholder0) { - this.placeholder = placeholder0; + public SaveRbp(NoOp placeholder) { + this.placeholder = placeholder; AMD64FrameMapBuilder frameMapBuilder = (AMD64FrameMapBuilder) getResult().getFrameMapBuilder(); this.reservedSlot = frameMapBuilder.allocateRBPSpillSlot(); - this.rescueSlot = newVariable(LIRKind.value(AMD64Kind.QWORD)); } /** @@ -158,21 +151,17 @@ * * @param useStack specifies if rbp must be saved to the stack */ - public void finalize(boolean useStack) { - RegisterValue rbpValue = rbp.asValue(LIRKind.value(AMD64Kind.QWORD)); - LIRInstruction move; + public AllocatableValue finalize(boolean useStack) { + AllocatableValue dst; if (useStack) { - move = new StoreRbpOp(rescueSlot, rbpValue, reservedSlot); + dst = reservedSlot; } else { ((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).freeRBPSpillSlot(); - move = new MoveFromRegOp(AMD64Kind.QWORD, rescueSlot, rbpValue); + dst = newVariable(LIRKind.value(AMD64Kind.QWORD)); } - placeholder.replace(getResult().getLIR(), move); - } - - AllocatableValue getRbpRescueSlot() { - return rescueSlot; + placeholder.replace(getResult().getLIR(), new MoveFromRegOp(AMD64Kind.QWORD, dst, rbp.asValue(LIRKind.value(AMD64Kind.QWORD)))); + return dst; } } @@ -227,6 +216,20 @@ return rescueSlotOp; } + /** + * List of epilogue operations that need to restore RBP. + */ + List<AMD64HotSpotEpilogueOp> epilogueOps = new ArrayList<>(2); + + @Override + public <I extends LIRInstruction> 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); @@ -264,7 +267,7 @@ if (pollOnReturnScratchRegister == null) { pollOnReturnScratchRegister = findPollOnReturnScratchRegister(); } - append(new AMD64HotSpotReturnOp(operand, getStub() != null, pollOnReturnScratchRegister, config, saveRbp.getRbpRescueSlot())); + append(new AMD64HotSpotReturnOp(operand, getStub() != null, pollOnReturnScratchRegister, config)); } @Override @@ -287,13 +290,13 @@ } public void emitLeaveCurrentStackFrame(SaveRegistersOp saveRegisterOp) { - append(new AMD64HotSpotLeaveCurrentStackFrameOp(saveRegisterOp, saveRbp.getRbpRescueSlot())); + append(new AMD64HotSpotLeaveCurrentStackFrameOp(saveRegisterOp)); } public void emitLeaveDeoptimizedStackFrame(Value frameSize, Value initialInfo) { Variable frameSizeVariable = load(frameSize); Variable initialInfoVariable = load(initialInfo); - append(new AMD64HotSpotLeaveDeoptimizedStackFrameOp(frameSizeVariable, initialInfoVariable, saveRbp.getRbpRescueSlot())); + append(new AMD64HotSpotLeaveDeoptimizedStackFrameOp(frameSizeVariable, initialInfoVariable)); } public void emitEnterUnpackFramesStackFrame(Value framePc, Value senderSp, Value senderFp, SaveRegistersOp saveRegisterOp) { @@ -494,7 +497,7 @@ assert outgoingCc.getArgumentCount() == 2; RegisterValue exceptionParameter = (RegisterValue) outgoingCc.getArgument(0); emitMove(exceptionParameter, exception); - append(new AMD64HotSpotUnwindOp(exceptionParameter, saveRbp.getRbpRescueSlot())); + append(new AMD64HotSpotUnwindOp(exceptionParameter)); } private void moveDeoptValuesToThread(Value actionAndReason, Value speculation) { @@ -520,18 +523,21 @@ Value actionAndReason = emitJavaConstant(getMetaAccess().encodeDeoptActionAndReason(action, reason, 0)); Value nullValue = emitConstant(LIRKind.reference(AMD64Kind.QWORD), JavaConstant.NULL_POINTER); moveDeoptValuesToThread(actionAndReason, nullValue); - append(new AMD64HotSpotDeoptimizeCallerOp(saveRbp.getRbpRescueSlot())); + append(new AMD64HotSpotDeoptimizeCallerOp()); } @Override public void beforeRegisterAllocation() { super.beforeRegisterAllocation(); boolean hasDebugInfo = getResult().getLIR().hasDebugInfo(); - saveRbp.finalize(hasDebugInfo); + AllocatableValue savedRbp = 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();
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveCurrentStackFrameOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -26,7 +26,6 @@ import jdk.internal.jvmci.code.Register; import jdk.internal.jvmci.code.RegisterConfig; import jdk.internal.jvmci.code.RegisterSaveLayout; -import jdk.internal.jvmci.meta.AllocatableValue; import jdk.internal.jvmci.meta.JavaKind; import com.oracle.graal.asm.amd64.AMD64Address; @@ -48,8 +47,8 @@ private final SaveRegistersOp saveRegisterOp; - public AMD64HotSpotLeaveCurrentStackFrameOp(SaveRegistersOp saveRegisterOp, AllocatableValue savedRbp) { - super(TYPE, savedRbp); + public AMD64HotSpotLeaveCurrentStackFrameOp(SaveRegistersOp saveRegisterOp) { + super(TYPE); this.saveRegisterOp = saveRegisterOp; }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLeaveDeoptimizedStackFrameOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -43,8 +43,8 @@ @Use(REG) AllocatableValue frameSize; @Use(REG) AllocatableValue framePointer; - public AMD64HotSpotLeaveDeoptimizedStackFrameOp(AllocatableValue frameSize, AllocatableValue initialInfo, AllocatableValue savedRbp) { - super(TYPE, savedRbp); + public AMD64HotSpotLeaveDeoptimizedStackFrameOp(AllocatableValue frameSize, AllocatableValue initialInfo) { + super(TYPE); this.frameSize = frameSize; this.framePointer = initialInfo; }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Fri Sep 18 15:09:46 2015 +0200 @@ -166,7 +166,7 @@ gen.emitMove(exceptionPcFixed, operand(exceptionPc)); Register thread = getGen().getProviders().getRegisters().getThreadRegister(); AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed, getGen().config.threadIsMethodHandleReturnOffset, - thread, getGen().getSaveRbp().getRbpRescueSlot()); + thread); append(op); }
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotReturnOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -26,7 +26,6 @@ import static com.oracle.graal.lir.LIRInstruction.OperandFlag.REG; import jdk.internal.jvmci.code.Register; import jdk.internal.jvmci.hotspot.HotSpotVMConfig; -import jdk.internal.jvmci.meta.AllocatableValue; import jdk.internal.jvmci.meta.Value; import com.oracle.graal.asm.amd64.AMD64MacroAssembler; @@ -46,8 +45,8 @@ private final Register scratchForSafepointOnReturn; private final HotSpotVMConfig config; - AMD64HotSpotReturnOp(Value value, boolean isStub, Register scratchForSafepointOnReturn, HotSpotVMConfig config, AllocatableValue savedRbp) { - super(TYPE, savedRbp); + AMD64HotSpotReturnOp(Value value, boolean isStub, Register scratchForSafepointOnReturn, HotSpotVMConfig config) { + super(TYPE); this.value = value; this.isStub = isStub; this.scratchForSafepointOnReturn = scratchForSafepointOnReturn;
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotUnwindOp.java Thu Sep 17 13:10:35 2015 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotUnwindOp.java Fri Sep 18 15:09:46 2015 +0200 @@ -29,7 +29,6 @@ import jdk.internal.jvmci.code.CallingConvention; import jdk.internal.jvmci.code.Register; import jdk.internal.jvmci.code.RegisterValue; -import jdk.internal.jvmci.meta.AllocatableValue; import com.oracle.graal.asm.amd64.AMD64Address; import com.oracle.graal.asm.amd64.AMD64MacroAssembler; @@ -49,8 +48,8 @@ @Use({REG}) protected RegisterValue exception; - AMD64HotSpotUnwindOp(RegisterValue exception, AllocatableValue savedRbp) { - super(TYPE, savedRbp); + AMD64HotSpotUnwindOp(RegisterValue exception) { + super(TYPE); this.exception = exception; }