Skip to content

Commit ad79b15

Browse files
committed
fix aarch64 killing lr
1 parent 2354517 commit ad79b15

1 file changed

Lines changed: 10 additions & 2 deletions

File tree

‎compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/lir/aarch64/AArch64ControlFlow.java‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,19 @@ public ReturnOp(Value x, AllocatableValue tailCallTarget, AllocatableValue[] add
8383

8484
@Override
8585
protected void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) {
86-
crb.frameContext.leave(crb);
8786
if (Value.ILLEGAL.equals(tailCallTarget)) {
87+
crb.frameContext.leave(crb);
8888
masm.ret(lr);
8989
} else {
90-
masm.jmp(asRegister(tailCallTarget));
90+
try (ScratchRegister scratch = masm.getScratchRegister()) {
91+
Register jumpTarget = asRegister(tailCallTarget);
92+
Register preservedJumpTarget = scratch.getRegister();
93+
// frameContext.leave() can restore callee-saved registers (including lr),
94+
// so preserve the tail-call target across the epilogue.
95+
masm.mov(64, preservedJumpTarget, jumpTarget);
96+
crb.frameContext.leave(crb);
97+
masm.jmp(preservedJumpTarget);
98+
}
9199
}
92100
crb.frameContext.returned(crb);
93101
}

0 commit comments

Comments
 (0)