# HG changeset patch # User yzheng # Date 1571237696 -7200 # Node ID d068b1e534ded87be5d9e40b4d8a68d036553938 # Parent 6b6bf0de534bcd8c98d34181933afdca8426d5b6 8231754: [JVMCI] Make r27 unconditionally reserved in JVMCI Summary: Reserve r27 (heap base register) on AArch64 unconditionally Reviewed-by: adinn, dlong diff -r 6b6bf0de534b -r d068b1e534de src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java Wed Oct 16 14:50:53 2019 +0100 +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java Wed Oct 16 16:54:56 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -127,8 +127,8 @@ return new HotSpotConstantReflectionProvider(runtime); } - private static RegisterConfig createRegisterConfig(AArch64HotSpotVMConfig config, TargetDescription target) { - return new AArch64HotSpotRegisterConfig(target, config.useCompressedOops); + private static RegisterConfig createRegisterConfig(TargetDescription target) { + return new AArch64HotSpotRegisterConfig(target); } protected HotSpotCodeCacheProvider createCodeCache(HotSpotJVMCIRuntime runtime, TargetDescription target, RegisterConfig regConfig) { @@ -167,7 +167,7 @@ metaAccess = createMetaAccess(runtime); } try (InitTimer rt = timer("create RegisterConfig")) { - regConfig = createRegisterConfig(config, target); + regConfig = createRegisterConfig(target); } try (InitTimer rt = timer("create CodeCache provider")) { codeCache = createCodeCache(runtime, target, regConfig); diff -r 6b6bf0de534b -r d068b1e534de src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java Wed Oct 16 14:50:53 2019 +0100 +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java Wed Oct 16 16:54:56 2019 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -126,11 +126,19 @@ public static final Register threadRegister = r28; public static final Register fp = r29; - private static final RegisterArray reservedRegisters = new RegisterArray(rscratch1, rscratch2, threadRegister, fp, lr, r31, zr, sp); + /** + * The heapBaseRegister, i.e. r27, is reserved unconditionally because HotSpot does not intend + * to support it as an allocatable register even when compressed oops is off. This register is + * excluded from callee-saved register at + * cpu/aarch64/sharedRuntime_aarch64.cpp:RegisterSaver::save_live_registers, which may lead to + * dereferencing unknown value from the stack at + * share/runtime/stackValue.cpp:StackValue::create_stack_value during deoptimization. + */ + private static final RegisterArray reservedRegisters = new RegisterArray(rscratch1, rscratch2, heapBaseRegister, threadRegister, fp, lr, r31, zr, sp); - private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) { + private static RegisterArray initAllocatable(Architecture arch) { RegisterArray allRegisters = arch.getAvailableValueRegisters(); - Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)]; + Register[] registers = new Register[allRegisters.size() - reservedRegisters.size()]; List reservedRegistersList = reservedRegisters.asList(); int idx = 0; @@ -139,12 +147,7 @@ // skip reserved registers continue; } - assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp)); - if (reserveForHeapBase && reg.equals(heapBaseRegister)) { - // skip heap base register - continue; - } - + assert !(reg.equals(heapBaseRegister) || reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp)) : reg; registers[idx++] = reg; } @@ -152,8 +155,8 @@ return new RegisterArray(registers); } - public AArch64HotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) { - this(target, initAllocatable(target.arch, useCompressedOops)); + public AArch64HotSpotRegisterConfig(TargetDescription target) { + this(target, initAllocatable(target.arch)); assert callerSaved.size() >= allocatable.size(); }