src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java Mon Mar 20 17:39:54 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java Mon Mar 20 17:39:54 2017
*** 20,45 ****
--- 20,44 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.lir.alloc.trace;
import static org.graalvm.compiler.lir.LIRValueUtil.asVirtualStackSlot;
import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue;
import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot;
import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.asShadowedRegisterValue;
import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isShadowedRegisterValue;
import static jdk.vm.ci.code.ValueUtil.asAllocatableValue;
import static jdk.vm.ci.code.ValueUtil.asRegister;
import static jdk.vm.ci.code.ValueUtil.asStackSlot;
import static jdk.vm.ci.code.ValueUtil.isIllegal;
import static jdk.vm.ci.code.ValueUtil.isRegister;
import static jdk.vm.ci.code.ValueUtil.isStackSlot;
+ import static org.graalvm.compiler.lir.LIRValueUtil.asVirtualStackSlot;
+ import static org.graalvm.compiler.lir.LIRValueUtil.isStackSlotValue;
+ import static org.graalvm.compiler.lir.LIRValueUtil.isVirtualStackSlot;
+ import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.asShadowedRegisterValue;
+ import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isShadowedRegisterValue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import org.graalvm.compiler.core.common.LIRKind;
import org.graalvm.compiler.debug.Debug;
import org.graalvm.compiler.debug.DebugCounter;
import org.graalvm.compiler.debug.GraalError;
*** 50,59 ****
--- 49,59 ----
import org.graalvm.compiler.lir.framemap.FrameMap;
import org.graalvm.compiler.lir.framemap.FrameMapBuilder;
import org.graalvm.compiler.lir.framemap.FrameMapBuilderTool;
import org.graalvm.compiler.lir.gen.LIRGenerationResult;
import org.graalvm.compiler.lir.gen.LIRGeneratorTool.MoveFactory;
+ import org.graalvm.compiler.options.OptionValues;
import jdk.vm.ci.code.Architecture;
import jdk.vm.ci.code.RegisterArray;
import jdk.vm.ci.code.StackSlot;
import jdk.vm.ci.meta.AllocatableValue;
*** 67,85 ****
--- 67,86 ----
private static final DebugCounter cycleBreakingSlotsReused = Debug.counter("TraceRA[cycleBreakingSlotsReused(global)]");
private int insertIdx;
private LIRInsertionBuffer insertionBuffer; // buffer where moves are inserted
! private final ArrayList<Value> mappingFrom;
! private final ArrayList<Value> mappingFromStack;
! private final List<AllocatableValue> mappingTo;
! private final ArrayList<AllocatableValue> mappingTo;
private final int[] registerBlocked;
private static final int STACK_SLOT_IN_CALLER_FRAME_IDX = -1;
private int[] stackBlocked;
private final int firstVirtualStackIndex;
private final MoveFactory spillMoveFactory;
private final FrameMapBuilder frameMapBuilder;
+ private final OptionValues options;
private void setValueBlocked(Value location, int direction) {
assert direction == 1 || direction == -1 : "out of bounds";
if (isStackSlotValue(location)) {
int stackIdx = getStackArrayIndex(location);
*** 150,159 ****
--- 151,161 ----
FrameMapBuilderTool frameMapBuilderTool = (FrameMapBuilderTool) frameMapBuilder;
this.stackBlocked = new int[frameMapBuilderTool.getNumberOfStackSlots()];
FrameMap frameMap = frameMapBuilderTool.getFrameMap();
this.firstVirtualStackIndex = !frameMap.frameNeedsAllocating() ? 0 : frameMap.currentFrameSize() + 1;
+ this.options = res.getLIR().getOptions();
}
private boolean checkEmpty() {
for (int i = 0; i < stackBlocked.length; i++) {
assert stackBlocked[i] == 0 : "stack map must be empty before and after processing";
*** 294,304 ****
--- 296,306 ----
private static boolean mightBeBlocked(Value location) {
return isRegister(location) || isStackSlotValue(location);
}
! private void createInsertionBuffer(ArrayList<LIRInstruction> list) {
assert !insertionBuffer.initialized() : "overwriting existing buffer";
insertionBuffer.init(list);
}
private void appendInsertionBuffer() {
*** 402,412 ****
--- 404,414 ----
// create a new spill interval and assign a stack slot to it
Value from = mappingFrom.get(spillCandidate);
try (Indent indent = Debug.logAndIndent("BreakCycle: %s", from)) {
AllocatableValue spillSlot = null;
! if (TraceRegisterAllocationPhase.Options.TraceRAreuseStackSlotsForMoveResolutionCycleBreaking.getValue(options) && !isStackSlotValue(from)) {
// don't use the stack slot if from is already the stack slot
Value fromStack = mappingFromStack.get(spillCandidate);
if (fromStack != null) {
spillSlot = (AllocatableValue) fromStack;
cycleBreakingSlotsReused.increment();
*** 433,443 ****
--- 435,445 ----
Debug.log("move %s <- %s (%s)", mappingTo.get(i), mappingFrom.get(i), mappingFromStack.get(i));
}
}
}
! public void setInsertPosition(ArrayList<LIRInstruction> insertList, int insertIdx) {
assert this.insertIdx == -1 : "use moveInsertPosition instead of setInsertPosition when data already set";
createInsertionBuffer(insertList);
this.insertIdx = insertIdx;
}
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceGlobalMoveResolver.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File