comparison graal/GraalCompiler/src/com/sun/c1x/alloc/RegisterVerifier.java @ 2718:c1ce2a53d6c3

Attempt to remove dependency between backend and BlockBegin.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 19 May 2011 16:05:42 +0200
parents 7ed72769d51a
children a2f62de90c76
comparison
equal deleted inserted replaced
2717:bd85cf08720a 2718:c1ce2a53d6c3
36 * @author Thomas Wuerthinger 36 * @author Thomas Wuerthinger
37 */ 37 */
38 final class RegisterVerifier { 38 final class RegisterVerifier {
39 39
40 LinearScan allocator; 40 LinearScan allocator;
41 List<BlockBegin> workList; // all blocks that must be processed 41 List<LIRBlock> workList; // all blocks that must be processed
42 ArrayMap<Interval[]> savedStates; // saved information of previous check 42 ArrayMap<Interval[]> savedStates; // saved information of previous check
43 43
44 // simplified access to methods of LinearScan 44 // simplified access to methods of LinearScan
45 C1XCompilation compilation() { 45 C1XCompilation compilation() {
46 return allocator.compilation; 46 return allocator.compilation;
54 int stateSize() { 54 int stateSize() {
55 return allocator.operands.maxRegisterNumber() + 1; 55 return allocator.operands.maxRegisterNumber() + 1;
56 } 56 }
57 57
58 // accessors 58 // accessors
59 Interval[] stateForBlock(BlockBegin block) { 59 Interval[] stateForBlock(LIRBlock block) {
60 return savedStates.get(block.blockID); 60 return savedStates.get(block.blockID());
61 } 61 }
62 62
63 void setStateForBlock(BlockBegin block, Interval[] savedState) { 63 void setStateForBlock(LIRBlock block, Interval[] savedState) {
64 savedStates.put(block.blockID, savedState); 64 savedStates.put(block.blockID(), savedState);
65 } 65 }
66 66
67 void addToWorkList(BlockBegin block) { 67 void addToWorkList(LIRBlock block) {
68 if (!workList.contains(block)) { 68 if (!workList.contains(block)) {
69 workList.add(block); 69 workList.add(block);
70 } 70 }
71 } 71 }
72 72
73 RegisterVerifier(LinearScan allocator) { 73 RegisterVerifier(LinearScan allocator) {
74 this.allocator = allocator; 74 this.allocator = allocator;
75 workList = new ArrayList<BlockBegin>(16); 75 workList = new ArrayList<LIRBlock>(16);
76 this.savedStates = new ArrayMap<Interval[]>(); 76 this.savedStates = new ArrayMap<Interval[]>();
77 77
78 } 78 }
79 79
80 void verify(BlockBegin start) { 80 void verify(LIRBlock start) {
81 // setup input registers (method arguments) for first block 81 // setup input registers (method arguments) for first block
82 Interval[] inputState = new Interval[stateSize()]; 82 Interval[] inputState = new Interval[stateSize()];
83 CiCallingConvention args = compilation().frameMap().incomingArguments(); 83 CiCallingConvention args = compilation().frameMap().incomingArguments();
84 for (int n = 0; n < args.locations.length; n++) { 84 for (int n = 0; n < args.locations.length; n++) {
85 CiValue operand = args.locations[n]; 85 CiValue operand = args.locations[n];
93 setStateForBlock(start, inputState); 93 setStateForBlock(start, inputState);
94 addToWorkList(start); 94 addToWorkList(start);
95 95
96 // main loop for verification 96 // main loop for verification
97 do { 97 do {
98 BlockBegin block = workList.get(0); 98 LIRBlock block = workList.get(0);
99 workList.remove(0); 99 workList.remove(0);
100 100
101 processBlock(block); 101 processBlock(block);
102 } while (!workList.isEmpty()); 102 } while (!workList.isEmpty());
103 } 103 }
104 104
105 void processBlock(BlockBegin block) { 105 void processBlock(LIRBlock block) {
106 if (C1XOptions.TraceLinearScanLevel >= 2) { 106 if (C1XOptions.TraceLinearScanLevel >= 2) {
107 TTY.println(); 107 TTY.println();
108 TTY.println("processBlock B%d", block.blockID); 108 TTY.println("processBlock B%d", block.blockID());
109 } 109 }
110 110
111 // must copy state because it is modified 111 // must copy state because it is modified
112 Interval[] inputState = copy(stateForBlock(block)); 112 Interval[] inputState = copy(stateForBlock(block));
113 113
127 127
128 // process all operations of the block 128 // process all operations of the block
129 processOperations(block.lir(), inputState); 129 processOperations(block.lir(), inputState);
130 130
131 // iterate all successors 131 // iterate all successors
132 for (BlockBegin succ : block.end().blockSuccessors()) { 132 for (LIRBlock succ : block.blockSuccessors()) {
133 processSuccessor(succ, inputState); 133 processSuccessor(succ, inputState);
134 } 134 }
135 } 135 }
136 136
137 void processXhandler(BlockBegin xhandler, Interval[] inputState) { 137 void processXhandler(LIRBlock xhandler, Interval[] inputState) {
138 if (C1XOptions.TraceLinearScanLevel >= 2) { 138 if (C1XOptions.TraceLinearScanLevel >= 2) {
139 TTY.println("processXhandler B%d", xhandler.blockID); 139 TTY.println("processXhandler B%d", xhandler.blockID());
140 } 140 }
141 141
142 // must copy state because it is modified 142 // must copy state because it is modified
143 inputState = copy(inputState); 143 inputState = copy(inputState);
144 144
146 processOperations(xhandler.lir(), inputState); 146 processOperations(xhandler.lir(), inputState);
147 } 147 }
148 processSuccessor(xhandler, inputState); 148 processSuccessor(xhandler, inputState);
149 } 149 }
150 150
151 void processSuccessor(BlockBegin block, Interval[] inputState) { 151 void processSuccessor(LIRBlock block, Interval[] inputState) {
152 Interval[] savedState = stateForBlock(block); 152 Interval[] savedState = stateForBlock(block);
153 153
154 if (savedState != null) { 154 if (savedState != null) {
155 // this block was already processed before. 155 // this block was already processed before.
156 // check if new inputState is consistent with savedState 156 // check if new inputState is consistent with savedState
166 // then the old calculation was correct. 166 // then the old calculation was correct.
167 savedStateCorrect = false; 167 savedStateCorrect = false;
168 savedState[i] = null; 168 savedState[i] = null;
169 169
170 if (C1XOptions.TraceLinearScanLevel >= 4) { 170 if (C1XOptions.TraceLinearScanLevel >= 4) {
171 TTY.println("processSuccessor B%d: invalidating slot %d", block.blockID, i); 171 TTY.println("processSuccessor B%d: invalidating slot %d", block.blockID(), i);
172 } 172 }
173 } 173 }
174 } 174 }
175 } 175 }
176 176
177 if (savedStateCorrect) { 177 if (savedStateCorrect) {
178 // already processed block with correct inputState 178 // already processed block with correct inputState
179 if (C1XOptions.TraceLinearScanLevel >= 2) { 179 if (C1XOptions.TraceLinearScanLevel >= 2) {
180 TTY.println("processSuccessor B%d: previous visit already correct", block.blockID); 180 TTY.println("processSuccessor B%d: previous visit already correct", block.blockID());
181 } 181 }
182 } else { 182 } else {
183 // must re-visit this block 183 // must re-visit this block
184 if (C1XOptions.TraceLinearScanLevel >= 2) { 184 if (C1XOptions.TraceLinearScanLevel >= 2) {
185 TTY.println("processSuccessor B%d: must re-visit because input state changed", block.blockID); 185 TTY.println("processSuccessor B%d: must re-visit because input state changed", block.blockID());
186 } 186 }
187 addToWorkList(block); 187 addToWorkList(block);
188 } 188 }
189 189
190 } else { 190 } else {
191 // block was not processed before, so set initial inputState 191 // block was not processed before, so set initial inputState
192 if (C1XOptions.TraceLinearScanLevel >= 2) { 192 if (C1XOptions.TraceLinearScanLevel >= 2) {
193 TTY.println("processSuccessor B%d: initial visit", block.blockID); 193 TTY.println("processSuccessor B%d: initial visit", block.blockID());
194 } 194 }
195 195
196 setStateForBlock(block, copy(inputState)); 196 setStateForBlock(block, copy(inputState));
197 addToWorkList(block); 197 addToWorkList(block);
198 } 198 }