# HG changeset patch # User Doug Simon # Date 1395229363 -3600 # Node ID abf7cf57df5ec023abb39706ef0a02c28b82fc0d # Parent 1d853e629891b036c62b6d2bd8e20f0f77fcb11e added RegisterConfig.areAllAllocatableRegistersCallerSaved() diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RegisterConfig.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RegisterConfig.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RegisterConfig.java Wed Mar 19 12:42:43 2014 +0100 @@ -102,4 +102,10 @@ * @return the register playing the role specified by {@code id} */ Register getRegisterForRole(int id); + + /** + * Determines if all {@link #getAllocatableRegisters() allocatable} registers are + * {@link #getCallerSaveRegisters() caller saved}. + */ + boolean areAllAllocatableRegistersCallerSaved(); } diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScanWalker.java Wed Mar 19 12:42:43 2014 +0100 @@ -70,11 +70,8 @@ super(allocator, unhandledFixedFirst, unhandledAnyFirst); // If all allocatable registers are caller saved, then no registers are live across a call - // site. - // The register allocator can save time not trying to find a register at a call site. - HashSet registers = new HashSet<>(Arrays.asList(allocator.frameMap.registerConfig.getAllocatableRegisters())); - registers.removeAll(Arrays.asList(allocator.frameMap.registerConfig.getCallerSaveRegisters())); - allocator.callKillsRegisters = registers.size() == 0; + // site. The register allocator can save time not trying to find a register at a call site. + allocator.callKillsRegisters = allocator.frameMap.registerConfig.areAllAllocatableRegistersCallerSaved(); moveResolver = new MoveResolver(allocator); spillIntervals = Util.uncheckedCast(new List[allocator.registers.length]); diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Wed Mar 19 12:42:43 2014 +0100 @@ -48,6 +48,8 @@ */ private final Register[] callerSaved; + private final boolean allAllocatableAreCallerSaved; + private final HashMap categorized = new HashMap<>(); private final RegisterAttributes[] attributesMap; @@ -152,6 +154,7 @@ callerSaved = callerSaveSet.toArray(new Register[callerSaveSet.size()]); assert callerSaved.length == allocatable.length || RegisterPressure.getValue() != null; + allAllocatableAreCallerSaved = true; attributesMap = RegisterAttributes.createMap(this, AMD64.allRegisters); } @@ -161,6 +164,11 @@ } @Override + public boolean areAllAllocatableRegistersCallerSaved() { + return allAllocatableAreCallerSaved; + } + + @Override public Register getRegisterForRole(int index) { throw new UnsupportedOperationException(); } diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotRegisterConfig.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotRegisterConfig.java Wed Mar 19 12:42:43 2014 +0100 @@ -74,6 +74,11 @@ } @Override + public boolean areAllAllocatableRegistersCallerSaved() { + throw GraalInternalError.unimplemented(); + } + + @Override public Register getRegisterForRole(int index) { throw GraalInternalError.unimplemented("PTXHotSpotRegisterConfig.getRegisterForRole()"); } diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Wed Mar 19 12:42:43 2014 +0100 @@ -144,6 +144,11 @@ } @Override + public boolean areAllAllocatableRegistersCallerSaved() { + return false; + } + + @Override public Register getRegisterForRole(int index) { throw new UnsupportedOperationException(); } diff -r 1d853e629891 -r abf7cf57df5e graal/com.oracle.graal.hsail/src/com/oracle/graal/hsail/HSAILRegisterConfig.java --- a/graal/com.oracle.graal.hsail/src/com/oracle/graal/hsail/HSAILRegisterConfig.java Wed Mar 19 12:01:30 2014 +0100 +++ b/graal/com.oracle.graal.hsail/src/com/oracle/graal/hsail/HSAILRegisterConfig.java Wed Mar 19 12:42:43 2014 +0100 @@ -24,7 +24,6 @@ package com.oracle.graal.hsail; import com.oracle.graal.api.code.*; - import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; @@ -168,6 +167,11 @@ } @Override + public boolean areAllAllocatableRegistersCallerSaved() { + throw GraalInternalError.unimplemented(); + } + + @Override public CalleeSaveLayout getCalleeSaveLayout() { return null; }