src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu Nov 14 11:16:14 2019 -0800
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java Thu Nov 14 12:21:00 2019 -0800
@@ -153,7 +153,7 @@
SaveRbp(NoOp placeholder) {
this.placeholder = placeholder;
AMD64FrameMapBuilder frameMapBuilder = (AMD64FrameMapBuilder) getResult().getFrameMapBuilder();
- this.reservedSlot = frameMapBuilder.allocateRBPSpillSlot();
+ this.reservedSlot = config.preserveFramePointer ? null : frameMapBuilder.allocateRBPSpillSlot();
}
/**
@@ -162,6 +162,7 @@
* @param useStack specifies if rbp must be saved to the stack
*/
public AllocatableValue finalize(boolean useStack) {
+ assert !config.preserveFramePointer : "rbp has been pushed onto the stack";
AllocatableValue dst;
if (useStack) {
dst = reservedSlot;
@@ -173,6 +174,10 @@
placeholder.replace(getResult().getLIR(), new MoveFromRegOp(AMD64Kind.QWORD, dst, rbp.asValue(LIRKind.value(AMD64Kind.QWORD))));
return dst;
}
+
+ public void remove() {
+ placeholder.remove(getResult().getLIR());
+ }
}
private SaveRbp saveRbp;
@@ -183,10 +188,6 @@
saveRbp = new SaveRbp(placeholder);
}
- protected SaveRbp getSaveRbp() {
- return saveRbp;
- }
-
/**
* Helper instruction to reserve a stack slot for the whole method. Note that the actual users
* of the stack slot might be inserted after stack slot allocation. This dummy instruction
@@ -547,16 +548,21 @@
public void beforeRegisterAllocation() {
super.beforeRegisterAllocation();
boolean hasDebugInfo = getResult().getLIR().hasDebugInfo();
- AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo);
+
+ if (config.preserveFramePointer) {
+ saveRbp.remove();
+ } else {
+ AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo);
+ for (AMD64HotSpotRestoreRbpOp op : epilogueOps) {
+ op.setSavedRbp(savedRbp);
+ }
+ }
+
if (hasDebugInfo) {
getResult().setDeoptimizationRescueSlot(((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).allocateDeoptimizationRescueSlot());
}
-
getResult().setMaxInterpreterFrameSize(debugInfoBuilder.maxInterpreterFrameSize());
- for (AMD64HotSpotRestoreRbpOp op : epilogueOps) {
- op.setSavedRbp(savedRbp);
- }
if (BenchmarkCounters.enabled) {
// ensure that the rescue slot is available
LIRInstruction op = getOrInitRescueSlotOp();