Mercurial > hg > truffle
comparison graal/GraalCompiler/src/com/sun/c1x/ir/ComputeLinearScanOrder.java @ 2723:173067211acb
Removed two more BlockBegin flags.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Thu, 19 May 2011 16:44:05 +0200 |
parents | 23d0bcfa3c84 |
children | 03b80fb10ae9 |
comparison
equal
deleted
inserted
replaced
2722:23d0bcfa3c84 | 2723:173067211acb |
---|---|
141 TTY.println("backward branch"); | 141 TTY.println("backward branch"); |
142 } | 142 } |
143 assert isVisited(cur) : "block must be visited when block is active"; | 143 assert isVisited(cur) : "block must be visited when block is active"; |
144 assert parent != null : "must have parent"; | 144 assert parent != null : "must have parent"; |
145 | 145 |
146 cur.setBlockFlag(BlockBegin.BlockFlag.LinearScanLoopHeader); | 146 //cur.setBlockFlag(BlockBegin.BlockFlag.LinearScanLoopHeader); |
147 | 147 |
148 parent.setBlockFlag(BlockBegin.BlockFlag.LinearScanLoopEnd); | 148 //parent.setBlockFlag(BlockBegin.BlockFlag.LinearScanLoopEnd); |
149 | 149 |
150 loopEndBlocks.add(parent); | 150 loopEndBlocks.add(parent); |
151 return; | 151 return; |
152 } | 152 } |
153 | 153 |
188 // limit loop-depth to 15 bit (only for security reason, it will never be so big) | 188 // limit loop-depth to 15 bit (only for security reason, it will never be so big) |
189 int loopDepth = 0; // TODO(tw): Assign loop depth | 189 int loopDepth = 0; // TODO(tw): Assign loop depth |
190 int weight = (loopDepth & 0x7FFF) << 16; | 190 int weight = (loopDepth & 0x7FFF) << 16; |
191 | 191 |
192 int curBit = 15; | 192 int curBit = 15; |
193 | |
194 // this is necessary for the (very rare) case that two successive blocks have | |
195 // the same loop depth, but a different loop index (can happen for endless loops | |
196 // with exception handlers) | |
197 if (!cur.isLinearScanLoopHeader()) { | |
198 weight |= (1 << curBit); | |
199 } | |
200 curBit--; | |
201 | |
202 // loop end blocks (blocks that end with a backward branch) are added | |
203 // after all other blocks of the loop. | |
204 if (!cur.isLinearScanLoopEnd()) { | |
205 weight |= (1 << curBit); | |
206 } | |
207 curBit--; | |
208 | 193 |
209 // exceptions should not be thrown in normal control flow, so these blocks | 194 // exceptions should not be thrown in normal control flow, so these blocks |
210 // are added as late as possible | 195 // are added as late as possible |
211 if (!(cur.end() instanceof Throw) && (singleSux == null || !(singleSux.end() instanceof Throw))) { | 196 if (!(cur.end() instanceof Throw) && (singleSux == null || !(singleSux.end() instanceof Throw))) { |
212 weight |= (1 << curBit); | 197 weight |= (1 << curBit); |
316 }); | 301 }); |
317 } while (workList.size() > 0); | 302 } while (workList.size() > 0); |
318 } | 303 } |
319 | 304 |
320 public void printBlocks() { | 305 public void printBlocks() { |
321 if (C1XOptions.TraceLinearScanLevel >= 2) { | |
322 TTY.println("----- loop information:"); | |
323 for (BlockBegin cur : linearScanOrder) { | |
324 TTY.print(String.format("%4d: B%02d: ", cur.linearScanNumber(), cur.blockID)); | |
325 // for (int loopIdx = 0; loopIdx < numLoops; loopIdx++) { | |
326 // TTY.print(String.format("%d = %b ", loopIdx, isBlockInLoop(loopIdx, cur))); | |
327 // } | |
328 TTY.println(String.format(" . loopIndex: %2d, loopDepth: %2d", -1, -1)); | |
329 } | |
330 } | |
331 | |
332 if (C1XOptions.TraceLinearScanLevel >= 1) { | 306 if (C1XOptions.TraceLinearScanLevel >= 1) { |
333 TTY.println("----- linear-scan block order:"); | 307 TTY.println("----- linear-scan block order:"); |
334 for (BlockBegin cur : linearScanOrder) { | 308 for (BlockBegin cur : linearScanOrder) { |
335 TTY.print(String.format("%4d: B%02d loop: %2d depth: %2d", cur.linearScanNumber(), cur.blockID, -1, -1)); | 309 TTY.print(String.format("%4d: B%02d loop: %2d depth: %2d", cur.linearScanNumber(), cur.blockID, -1, -1)); |
336 | |
337 TTY.print(cur.isLinearScanLoopHeader() ? " lh" : " "); | |
338 TTY.print(cur.isLinearScanLoopEnd() ? " le" : " "); | |
339 | 310 |
340 if (cur.numberOfPreds() > 0) { | 311 if (cur.numberOfPreds() > 0) { |
341 TTY.print(" preds: "); | 312 TTY.print(" preds: "); |
342 for (int j = 0; j < cur.numberOfPreds(); j++) { | 313 for (int j = 0; j < cur.numberOfPreds(); j++) { |
343 BlockBegin pred = cur.predAt(j).block(); | 314 BlockBegin pred = cur.predAt(j).block(); |
374 assert cur.linearScanNumber() == i : "incorrect linearScanNumber"; | 345 assert cur.linearScanNumber() == i : "incorrect linearScanNumber"; |
375 assert cur.linearScanNumber() >= 0 && cur.linearScanNumber() == linearScanOrder.indexOf(cur) : "incorrect linearScanNumber"; | 346 assert cur.linearScanNumber() >= 0 && cur.linearScanNumber() == linearScanOrder.indexOf(cur) : "incorrect linearScanNumber"; |
376 | 347 |
377 for (BlockBegin sux : cur.end().blockSuccessors()) { | 348 for (BlockBegin sux : cur.end().blockSuccessors()) { |
378 assert sux.linearScanNumber() >= 0 && sux.linearScanNumber() == linearScanOrder.indexOf(sux) : "incorrect linearScanNumber"; | 349 assert sux.linearScanNumber() >= 0 && sux.linearScanNumber() == linearScanOrder.indexOf(sux) : "incorrect linearScanNumber"; |
379 if (!cur.checkBlockFlag(BlockBegin.BlockFlag.LinearScanLoopEnd)) { | |
380 assert cur.linearScanNumber() < sux.linearScanNumber() : "invalid order"; | |
381 } | |
382 } | 350 } |
383 | 351 |
384 for (Instruction pred : cur.blockPredecessors()) { | 352 for (Instruction pred : cur.blockPredecessors()) { |
385 BlockBegin begin = pred.block(); | 353 BlockBegin begin = pred.block(); |
386 assert begin.linearScanNumber() >= 0 && begin.linearScanNumber() == linearScanOrder.indexOf(begin) : "incorrect linearScanNumber"; | 354 assert begin.linearScanNumber() >= 0 && begin.linearScanNumber() == linearScanOrder.indexOf(begin) : "incorrect linearScanNumber"; |
387 if (!cur.checkBlockFlag(BlockBegin.BlockFlag.LinearScanLoopHeader)) { | |
388 assert cur.linearScanNumber() > begin.linearScanNumber() : "invalid order"; | |
389 } | |
390 } | 355 } |
391 } | 356 } |
392 | 357 |
393 return true; | 358 return true; |
394 } | 359 } |