diff -r 0152ad7b38b8 -r 6df94ce3ab2f 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 Tue Sep 24 08:54:08 2019 -0700 +++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Sep 24 12:47:15 2019 -0400 @@ -299,7 +299,7 @@ * machine instruction actually zeros _all_ XMM registers which is fine since we know * that their upper half is not used. */ - append(new AMD64VZeroUpper(arguments)); + append(new AMD64VZeroUpper(arguments, getRegisterConfig())); } super.emitForeignCallOp(linkage, result, arguments, temps, info); } @@ -307,10 +307,9 @@ /** * @param savedRegisters the registers saved by this operation which may be subject to pruning * @param savedRegisterLocations the slots to which the registers are saved - * @param supportsRemove determines if registers can be pruned */ - protected AMD64SaveRegistersOp emitSaveRegisters(Register[] savedRegisters, AllocatableValue[] savedRegisterLocations, boolean supportsRemove) { - AMD64SaveRegistersOp save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations, supportsRemove); + protected AMD64SaveRegistersOp emitSaveRegisters(Register[] savedRegisters, AllocatableValue[] savedRegisterLocations) { + AMD64SaveRegistersOp save = new AMD64SaveRegistersOp(savedRegisters, savedRegisterLocations); append(save); return save; } @@ -330,15 +329,19 @@ /** * Adds a node to the graph that saves all allocatable registers to the stack. * - * @param supportsRemove determines if registers can be pruned * @return the register save node */ - private AMD64SaveRegistersOp emitSaveAllRegisters(Register[] savedRegisters, boolean supportsRemove) { + private AMD64SaveRegistersOp emitSaveAllRegisters() { + Register[] savedRegisters = getSaveableRegisters(); AllocatableValue[] savedRegisterLocations = new AllocatableValue[savedRegisters.length]; for (int i = 0; i < savedRegisters.length; i++) { savedRegisterLocations[i] = allocateSaveRegisterLocation(savedRegisters[i]); } - return emitSaveRegisters(savedRegisters, savedRegisterLocations, supportsRemove); + return emitSaveRegisters(savedRegisters, savedRegisterLocations); + } + + protected Register[] getSaveableRegisters() { + return getResult().getRegisterAllocationConfig().getAllocatableRegisters().toArray(); } protected void emitRestoreRegisters(AMD64SaveRegistersOp save) { @@ -369,11 +372,8 @@ AMD64SaveRegistersOp save = null; Stub stub = getStub(); - if (destroysRegisters) { - if (stub != null && stub.preservesRegisters()) { - Register[] savedRegisters = getRegisterConfig().getAllocatableRegisters().toArray(); - save = emitSaveAllRegisters(savedRegisters, true); - } + if (destroysRegisters && stub != null && stub.shouldSaveRegistersAroundCalls()) { + save = emitSaveAllRegisters(); } Variable result; @@ -392,19 +392,15 @@ result = super.emitForeignCall(hotspotLinkage, debugInfo, args); } - if (destroysRegisters) { - if (stub != null) { - if (stub.preservesRegisters()) { - HotSpotLIRGenerationResult generationResult = getResult(); - LIRFrameState key = currentRuntimeCallInfo; - if (key == null) { - key = LIRFrameState.NO_STATE; - } - assert !generationResult.getCalleeSaveInfo().containsKey(key); - generationResult.getCalleeSaveInfo().put(key, save); - emitRestoreRegisters(save); - } + if (save != null) { + HotSpotLIRGenerationResult generationResult = getResult(); + LIRFrameState key = currentRuntimeCallInfo; + if (key == null) { + key = LIRFrameState.NO_STATE; } + assert !generationResult.getCalleeSaveInfo().containsKey(key); + generationResult.getCalleeSaveInfo().put(key, save); + emitRestoreRegisters(save); } return result;