annotate graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java @ 23154:f2a8407253da

TraceRA: move resolution: count number of created stack slots.
author Josef Eisl <josef.eisl@jku.at>
date Thu, 10 Dec 2015 18:22:07 +0100
parents 23f9a72eb037
children e660e8431be0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
1 /*
22510
d3d19b31e9a4 Split MoveOp into ValueMoveOp and LoadConstantOp.
Roland Schatz <roland.schatz@oracle.com>
parents: 22447
diff changeset
2 * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
4 *
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
7 * published by the Free Software Foundation.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
8 *
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
13 * accompanied this code).
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
14 *
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
18 *
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
21 * questions.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
22 */
22352
e6ea77e2a770 Move different register allocators into sub-packages.
Josef Eisl <josef.eisl@jku.at>
parents: 22350
diff changeset
23 package com.oracle.graal.lir.alloc.trace;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
24
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
25 import static com.oracle.graal.lir.LIRValueUtil.asVirtualStackSlot;
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
26 import static com.oracle.graal.lir.LIRValueUtil.isStackSlotValue;
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
27 import static com.oracle.graal.lir.LIRValueUtil.isVirtualStackSlot;
22646
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
28 import static com.oracle.graal.lir.alloc.trace.TraceUtil.asShadowedRegisterValue;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
29 import static com.oracle.graal.lir.alloc.trace.TraceUtil.isShadowedRegisterValue;
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
30 import static jdk.vm.ci.code.ValueUtil.asAllocatableValue;
22790
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
31 import static jdk.vm.ci.code.ValueUtil.asRegister;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
32 import static jdk.vm.ci.code.ValueUtil.asStackSlot;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
33 import static jdk.vm.ci.code.ValueUtil.isIllegal;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
34 import static jdk.vm.ci.code.ValueUtil.isRegister;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
35 import static jdk.vm.ci.code.ValueUtil.isStackSlot;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
36
22646
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
37 import java.util.ArrayList;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
38 import java.util.Arrays;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
39 import java.util.HashSet;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
40 import java.util.List;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
41
22790
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
42 import jdk.vm.ci.code.Architecture;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
43 import jdk.vm.ci.code.Register;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
44 import jdk.vm.ci.code.StackSlot;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
45 import jdk.vm.ci.common.JVMCIError;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
46 import jdk.vm.ci.meta.AllocatableValue;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
47 import jdk.vm.ci.meta.LIRKind;
615f3bbbb174 Update jvmci and truffle import: Rename jdk.internal.jvmci to jdk.vm.ci
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 22646
diff changeset
48 import jdk.vm.ci.meta.Value;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
49
22646
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
50 import com.oracle.graal.debug.Debug;
23154
f2a8407253da TraceRA: move resolution: count number of created stack slots.
Josef Eisl <josef.eisl@jku.at>
parents: 23124
diff changeset
51 import com.oracle.graal.debug.DebugMetric;
22646
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
52 import com.oracle.graal.debug.Indent;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
53 import com.oracle.graal.lir.LIRInsertionBuffer;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
54 import com.oracle.graal.lir.LIRInstruction;
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
55 import com.oracle.graal.lir.VirtualStackSlot;
22646
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
56 import com.oracle.graal.lir.framemap.FrameMap;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
57 import com.oracle.graal.lir.framemap.FrameMapBuilder;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
58 import com.oracle.graal.lir.framemap.FrameMapBuilderTool;
05183a084a08 updated imports to be explicit and added checkstyle rule to forbid * imports
Doug Simon <doug.simon@oracle.com>
parents: 22573
diff changeset
59 import com.oracle.graal.lir.gen.LIRGenerationResult;
22927
526b102d5a20 Move creation of move instructions into separate factory.
Roland Schatz <roland.schatz@oracle.com>
parents: 22843
diff changeset
60 import com.oracle.graal.lir.gen.LIRGeneratorTool.MoveFactory;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
61
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
62 /**
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
63 */
22978
64eb72b6165d TraceRA: add TraceGlobalMoveResolutionMappingTest.
Josef Eisl <josef.eisl@jku.at>
parents: 22976
diff changeset
64 final class TraceGlobalMoveResolver extends TraceGlobalMoveResolutionPhase.MoveResolver {
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
65
23154
f2a8407253da TraceRA: move resolution: count number of created stack slots.
Josef Eisl <josef.eisl@jku.at>
parents: 23124
diff changeset
66 private static final DebugMetric cycleBreakingSlotsAllocated = Debug.metric("TraceRA[cycleBreakingSlotsAllocated(global)]");
f2a8407253da TraceRA: move resolution: count number of created stack slots.
Josef Eisl <josef.eisl@jku.at>
parents: 23124
diff changeset
67
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
68 private int insertIdx;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
69 private LIRInsertionBuffer insertionBuffer; // buffer where moves are inserted
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
70
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
71 private final List<Value> mappingFrom;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
72 private final List<AllocatableValue> mappingTo;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
73 private final int[] registerBlocked;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
74 private static final int STACK_SLOT_IN_CALLER_FRAME_IDX = -1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
75 private int[] stackBlocked;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
76 private final int firstVirtualStackIndex;
22927
526b102d5a20 Move creation of move instructions into separate factory.
Roland Schatz <roland.schatz@oracle.com>
parents: 22843
diff changeset
77 private final MoveFactory spillMoveFactory;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
78 private final FrameMapBuilder frameMapBuilder;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
79
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
80 private void setValueBlocked(Value location, int direction) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
81 assert direction == 1 || direction == -1 : "out of bounds";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
82 if (isStackSlotValue(location)) {
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
83 int stackIdx = getStackArrayIndex(location);
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
84 if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
85 // incoming stack arguments can be ignored
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
86 return;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
87 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
88 if (stackIdx >= stackBlocked.length) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
89 stackBlocked = Arrays.copyOf(stackBlocked, stackIdx + 1);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
90 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
91 stackBlocked[stackIdx] += direction;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
92 } else {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
93 assert direction == 1 || direction == -1 : "out of bounds";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
94 if (isRegister(location)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
95 registerBlocked[asRegister(location).number] += direction;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
96 } else {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
97 throw JVMCIError.shouldNotReachHere("unhandled value " + location);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
98 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
99 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
100 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
101
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
102 private int valueBlocked(Value location) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
103 if (isStackSlotValue(location)) {
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
104 int stackIdx = getStackArrayIndex(location);
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
105 if (stackIdx == STACK_SLOT_IN_CALLER_FRAME_IDX) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
106 // incoming stack arguments are always blocked (aka they can not be written)
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
107 return 1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
108 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
109 if (stackIdx >= stackBlocked.length) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
110 return 0;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
111 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
112 return stackBlocked[stackIdx];
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
113 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
114 if (isRegister(location)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
115 return registerBlocked[asRegister(location).number];
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
116 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
117 throw JVMCIError.shouldNotReachHere("unhandled value " + location);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
118 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
119
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
120 private static boolean areMultipleReadsAllowed() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
121 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
122 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
123
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
124 private boolean hasMappings() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
125 return mappingFrom.size() > 0;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
126 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
127
22927
526b102d5a20 Move creation of move instructions into separate factory.
Roland Schatz <roland.schatz@oracle.com>
parents: 22843
diff changeset
128 private MoveFactory getSpillMoveFactory() {
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
129 return spillMoveFactory;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
130 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
131
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
132 private Register[] getRegisters() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
133 return frameMapBuilder.getRegisterConfig().getAllocatableRegisters();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
134 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
135
22927
526b102d5a20 Move creation of move instructions into separate factory.
Roland Schatz <roland.schatz@oracle.com>
parents: 22843
diff changeset
136 public TraceGlobalMoveResolver(LIRGenerationResult res, MoveFactory spillMoveFactory, Architecture arch) {
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
137
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
138 this.mappingFrom = new ArrayList<>(8);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
139 this.mappingTo = new ArrayList<>(8);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
140 this.insertIdx = -1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
141 this.insertionBuffer = new LIRInsertionBuffer();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
142
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
143 this.frameMapBuilder = res.getFrameMapBuilder();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
144 this.spillMoveFactory = spillMoveFactory;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
145 this.registerBlocked = new int[arch.getRegisters().length];
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
146
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
147 FrameMapBuilderTool frameMapBuilderTool = (FrameMapBuilderTool) frameMapBuilder;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
148 this.stackBlocked = new int[frameMapBuilderTool.getNumberOfStackSlots()];
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
149
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
150 FrameMap frameMap = frameMapBuilderTool.getFrameMap();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
151 this.firstVirtualStackIndex = !frameMap.frameNeedsAllocating() ? 0 : frameMap.currentFrameSize() + 1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
152 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
153
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
154 private boolean checkEmpty() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
155 for (int i = 0; i < stackBlocked.length; i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
156 assert stackBlocked[i] == 0 : "stack map must be empty before and after processing";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
157 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
158 assert mappingFrom.size() == 0 && mappingTo.size() == 0 : "list must be empty before and after processing";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
159 for (int i = 0; i < getRegisters().length; i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
160 assert registerBlocked[i] == 0 : "register map must be empty before and after processing";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
161 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
162 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
163 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
164
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
165 private boolean verifyBeforeResolve() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
166 assert mappingFrom.size() == mappingTo.size() : "length must be equal";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
167 assert insertIdx != -1 : "insert position not set";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
168
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
169 int i;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
170 int j;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
171 if (!areMultipleReadsAllowed()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
172 for (i = 0; i < mappingFrom.size(); i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
173 for (j = i + 1; j < mappingFrom.size(); j++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
174 assert mappingFrom.get(i) == null || mappingFrom.get(i) != mappingFrom.get(j) : "cannot read from same interval twice";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
175 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
176 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
177 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
178
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
179 for (i = 0; i < mappingTo.size(); i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
180 for (j = i + 1; j < mappingTo.size(); j++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
181 assert mappingTo.get(i) != mappingTo.get(j) : "cannot write to same interval twice";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
182 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
183 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
184
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
185 for (i = 0; i < mappingTo.size(); i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
186 Value to = mappingTo.get(i);
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
187 assert !isStackSlotValue(to) || getStackArrayIndex(to) != STACK_SLOT_IN_CALLER_FRAME_IDX : "Cannot move to in argument: " + to;
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
188 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
189
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
190 HashSet<Value> usedRegs = new HashSet<>();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
191 if (!areMultipleReadsAllowed()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
192 for (i = 0; i < mappingFrom.size(); i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
193 Value from = mappingFrom.get(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
194 if (from != null && !isIllegal(from)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
195 boolean unique = usedRegs.add(from);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
196 assert unique : "cannot read from same register twice";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
197 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
198 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
199 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
200
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
201 usedRegs.clear();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
202 for (i = 0; i < mappingTo.size(); i++) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
203 Value to = mappingTo.get(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
204 if (isIllegal(to)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
205 // After insertion the location may become illegal, so don't check it since multiple
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
206 // intervals might be illegal.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
207 continue;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
208 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
209 boolean unique = usedRegs.add(to);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
210 assert unique : "cannot write to same register twice";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
211 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
212
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
213 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
214 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
215
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
216 // mark assignedReg and assignedRegHi of the interval as blocked
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
217 private void block(Value location) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
218 if (mightBeBlocked(location)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
219 assert areMultipleReadsAllowed() || valueBlocked(location) == 0 : "location already marked as used: " + location;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
220 setValueBlocked(location, 1);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
221 Debug.log("block %s", location);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
222 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
223 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
224
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
225 // mark assignedReg and assignedRegHi of the interval as unblocked
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
226 private void unblock(Value location) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
227 if (mightBeBlocked(location)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
228 assert valueBlocked(location) > 0 : "location already marked as unused: " + location;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
229 setValueBlocked(location, -1);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
230 Debug.log("unblock %s", location);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
231 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
232 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
233
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
234 /**
23124
23f9a72eb037 TraceRA: move Trace Linear Scan implementation into sub-package.
Josef Eisl <josef.eisl@jku.at>
parents: 22978
diff changeset
235 * Checks if {@code to} is not blocked or is only blocked by {@code from}.
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
236 */
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
237 private boolean safeToProcessMove(Value fromLocation, Value toLocation) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
238 if (mightBeBlocked(toLocation)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
239 if ((valueBlocked(toLocation) > 1 || (valueBlocked(toLocation) == 1 && !isMoveToSelf(fromLocation, toLocation)))) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
240 return false;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
241 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
242 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
243
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
244 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
245 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
246
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
247 public static boolean isMoveToSelf(Value from, Value to) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
248 assert to != null;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
249 if (to.equals(from)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
250 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
251 }
22447
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
252 if (from == null) {
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
253 return false;
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
254 }
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
255 if (isShadowedRegisterValue(from)) {
22976
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
256 /* From is a shadowed register. */
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
257 if (isShadowedRegisterValue(to)) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
258 // both shadowed but not equal
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
259 return false;
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
260 }
22447
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
261 ShadowedRegisterValue shadowed = asShadowedRegisterValue(from);
22976
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
262 if (isRegisterToRegisterMoveToSelf(shadowed.getRegister(), to)) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
263 return true;
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
264 }
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
265 if (isStackSlotValue(to)) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
266 return to.equals(shadowed.getStackSlot());
22447
cc1f997e6185 TraceRA: intoduce ShadowedRegisterValue.
Josef Eisl <josef.eisl@jku.at>
parents: 22352
diff changeset
267 }
22976
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
268 } else {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
269 /*
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
270 * A shadowed destination value is never a self move it both values are not equal. Fall
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
271 * through.
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
272 */
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
273 // if (isShadowedRegisterValue(to)) return false;
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
274
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
275 return isRegisterToRegisterMoveToSelf(from, to);
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
276 }
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
277 return false;
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
278 }
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
279
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
280 private static boolean isRegisterToRegisterMoveToSelf(Value from, Value to) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
281 if (to.equals(from)) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
282 return true;
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
283 }
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
284 if (isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) {
fe8534ad7e6e TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming.
Josef Eisl <josef.eisl@jku.at>
parents: 22927
diff changeset
285 // Values differ but Registers are the same
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
286 assert LIRKind.verifyMoveKinds(to.getLIRKind(), from.getLIRKind()) : String.format("Same register but Kind mismatch %s <- %s", to, from);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
287 return true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
288 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
289 return false;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
290 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
291
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
292 private static boolean mightBeBlocked(Value location) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
293 return isRegister(location) || isStackSlotValue(location);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
294 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
295
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
296 private void createInsertionBuffer(List<LIRInstruction> list) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
297 assert !insertionBuffer.initialized() : "overwriting existing buffer";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
298 insertionBuffer.init(list);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
299 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
300
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
301 private void appendInsertionBuffer() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
302 if (insertionBuffer.initialized()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
303 insertionBuffer.finish();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
304 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
305 assert !insertionBuffer.initialized() : "must be uninitialized now";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
306
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
307 insertIdx = -1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
308 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
309
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
310 private void insertMove(Value fromOperand, AllocatableValue toOperand) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
311 assert !fromOperand.equals(toOperand) : "from and to are equal: " + fromOperand + " vs. " + toOperand;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
312 assert LIRKind.verifyMoveKinds(fromOperand.getLIRKind(), fromOperand.getLIRKind()) : "move between different types";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
313 assert insertIdx != -1 : "must setup insert position first";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
314
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
315 insertionBuffer.append(insertIdx, createMove(fromOperand, toOperand));
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
316
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
317 if (Debug.isLogEnabled()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
318 Debug.log("insert move from %s to %s at %d", fromOperand, toOperand, insertIdx);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
319 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
320 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
321
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
322 /**
23124
23f9a72eb037 TraceRA: move Trace Linear Scan implementation into sub-package.
Josef Eisl <josef.eisl@jku.at>
parents: 22978
diff changeset
323 * @param fromOpr Operand of the {@code from} interval
23f9a72eb037 TraceRA: move Trace Linear Scan implementation into sub-package.
Josef Eisl <josef.eisl@jku.at>
parents: 22978
diff changeset
324 * @param toOpr Operand of the {@code to} interval
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
325 */
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
326 private LIRInstruction createMove(Value fromOpr, AllocatableValue toOpr) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
327 if (isStackSlotValue(toOpr) && isStackSlotValue(fromOpr)) {
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
328 return getSpillMoveFactory().createStackMove(toOpr, asAllocatableValue(fromOpr));
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
329 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
330 return getSpillMoveFactory().createMove(toOpr, fromOpr);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
331 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
332
22573
74b3e5c0209c suppressed -Xlint:try warnings
Doug Simon <doug.simon@oracle.com>
parents: 22565
diff changeset
333 @SuppressWarnings("try")
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
334 private void resolveMappings() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
335 try (Indent indent = Debug.logAndIndent("resolveMapping")) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
336 assert verifyBeforeResolve();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
337 if (Debug.isLogEnabled()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
338 printMapping();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
339 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
340
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
341 // Block all registers that are used as input operands of a move.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
342 // When a register is blocked, no move to this register is emitted.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
343 // This is necessary for detecting cycles in moves.
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
344 for (int i = mappingFrom.size() - 1; i >= 0; i--) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
345 Value from = mappingFrom.get(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
346 block(from);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
347 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
348
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
349 int spillCandidate = -1;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
350 while (mappingFrom.size() > 0) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
351 boolean processedInterval = false;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
352
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
353 for (int i = mappingFrom.size() - 1; i >= 0; i--) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
354 Value fromInterval = mappingFrom.get(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
355 AllocatableValue toInterval = mappingTo.get(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
356
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
357 Value fromLocation = fromInterval;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
358 AllocatableValue toLocation = toInterval;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
359 if (safeToProcessMove(fromLocation, toLocation)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
360 // this interval can be processed because target is free
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
361 insertMove(fromLocation, toLocation);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
362 unblock(fromLocation);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
363 mappingFrom.remove(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
364 mappingTo.remove(i);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
365
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
366 processedInterval = true;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
367 } else if (fromInterval != null && isRegister(fromLocation)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
368 // this interval cannot be processed now because target is not free
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
369 // it starts in a register, so it is a possible candidate for spilling
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
370 spillCandidate = i;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
371 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
372 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
373
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
374 if (!processedInterval) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
375 breakCycle(spillCandidate);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
376 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
377 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
378 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
379
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
380 // check that all intervals have been processed
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
381 assert checkEmpty();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
382 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
383
22573
74b3e5c0209c suppressed -Xlint:try warnings
Doug Simon <doug.simon@oracle.com>
parents: 22565
diff changeset
384 @SuppressWarnings("try")
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
385 private void breakCycle(int spillCandidate) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
386 // no move could be processed because there is a cycle in the move list
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
387 // (e.g. r1 . r2, r2 . r1), so one interval must be spilled to memory
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
388 assert spillCandidate != -1 : "no interval in register for spilling found";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
389
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
390 // create a new spill interval and assign a stack slot to it
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
391 Value from = mappingFrom.get(spillCandidate);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
392 try (Indent indent = Debug.logAndIndent("BreakCycle: %s", from)) {
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
393 VirtualStackSlot spillSlot = frameMapBuilder.allocateSpillSlot(from.getLIRKind());
23154
f2a8407253da TraceRA: move resolution: count number of created stack slots.
Josef Eisl <josef.eisl@jku.at>
parents: 23124
diff changeset
394 cycleBreakingSlotsAllocated.increment();
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
395 if (Debug.isLogEnabled()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
396 Debug.log("created new slot for spilling: %s", spillSlot);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
397 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
398 // insert a move from register to stack and update the mapping
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
399 insertMove(from, spillSlot);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
400 block(spillSlot);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
401 mappingFrom.set(spillCandidate, spillSlot);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
402 unblock(from);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
403 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
404 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
405
22573
74b3e5c0209c suppressed -Xlint:try warnings
Doug Simon <doug.simon@oracle.com>
parents: 22565
diff changeset
406 @SuppressWarnings("try")
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
407 private void printMapping() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
408 try (Indent indent = Debug.logAndIndent("Mapping")) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
409 for (int i = mappingFrom.size() - 1; i >= 0; i--) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
410 Debug.log("move %s <- %s", mappingTo.get(i), mappingFrom.get(i));
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
411 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
412 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
413 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
414
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
415 public void setInsertPosition(List<LIRInstruction> insertList, int insertIdx) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
416 assert this.insertIdx == -1 : "use moveInsertPosition instead of setInsertPosition when data already set";
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
417
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
418 createInsertionBuffer(insertList);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
419 this.insertIdx = insertIdx;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
420 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
421
22978
64eb72b6165d TraceRA: add TraceGlobalMoveResolutionMappingTest.
Josef Eisl <josef.eisl@jku.at>
parents: 22976
diff changeset
422 @Override
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
423 public void addMapping(Value from, AllocatableValue to) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
424 if (Debug.isLogEnabled()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
425 Debug.log("add move mapping from %s to %s", from, to);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
426 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
427
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
428 assert !from.equals(to) : "from and to interval equal: " + from;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
429 assert LIRKind.verifyMoveKinds(to.getLIRKind(), from.getLIRKind()) : String.format("Kind mismatch: %s vs. %s, from=%s, to=%s", from.getLIRKind(), to.getLIRKind(), from, to);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
430 mappingFrom.add(from);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
431 mappingTo.add(to);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
432 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
433
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
434 public void resolveAndAppendMoves() {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
435 if (hasMappings()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
436 resolveMappings();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
437 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
438 appendInsertionBuffer();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
439 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
440
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
441 private int getStackArrayIndex(Value stackSlotValue) {
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
442 if (isStackSlot(stackSlotValue)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
443 return getStackArrayIndex(asStackSlot(stackSlotValue));
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
444 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
445 if (isVirtualStackSlot(stackSlotValue)) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
446 return getStackArrayIndex(asVirtualStackSlot(stackSlotValue));
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
447 }
22843
ae8a63a7aa9e Update jvmci import: Move VirtualStackSlot from JVMCI to Graal and remove referenceMapIndex.
Roland Schatz <roland.schatz@oracle.com>
parents: 22790
diff changeset
448 throw JVMCIError.shouldNotReachHere("value is not a stack slot: " + stackSlotValue);
22350
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
449 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
450
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
451 private int getStackArrayIndex(StackSlot stackSlot) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
452 int stackIdx;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
453 if (stackSlot.isInCallerFrame()) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
454 // incoming stack arguments can be ignored
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
455 stackIdx = STACK_SLOT_IN_CALLER_FRAME_IDX;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
456 } else {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
457 assert stackSlot.getRawAddFrameSize() : "Unexpected stack slot: " + stackSlot;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
458 int offset = -stackSlot.getRawOffset();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
459 assert 0 <= offset && offset < firstVirtualStackIndex : String.format("Wrong stack slot offset: %d (first virtual stack slot index: %d", offset, firstVirtualStackIndex);
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
460 stackIdx = offset;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
461 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
462 return stackIdx;
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
463 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
464
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
465 private int getStackArrayIndex(VirtualStackSlot virtualStackSlot) {
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
466 return firstVirtualStackIndex + virtualStackSlot.getId();
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
467 }
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
468
06a9e6737dcf Drop initial version of the trace based register allocator.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
469 }