Mercurial > hg > truffle
comparison graal/com.oracle.max.graal.java/src/com/oracle/max/graal/java/BlockMap.java @ 4440:271220b49abc
profiling info fixes
author | Christian Haeubl <christian.haeubl@oracle.com> |
---|---|
date | Fri, 20 Jan 2012 18:24:17 -0800 |
parents | 2af849af1723 |
children | 5acf4a974e4a |
comparison
equal
deleted
inserted
replaced
4439:f7251c729b31 | 4440:271220b49abc |
---|---|
234 private void iterateOverBytecodes() { | 234 private void iterateOverBytecodes() { |
235 // iterate over the bytecodes top to bottom. | 235 // iterate over the bytecodes top to bottom. |
236 // mark the entrypoints of basic blocks and build lists of successors for | 236 // mark the entrypoints of basic blocks and build lists of successors for |
237 // all bytecodes that end basic blocks (i.e. goto, ifs, switches, throw, jsr, returns, ret) | 237 // all bytecodes that end basic blocks (i.e. goto, ifs, switches, throw, jsr, returns, ret) |
238 byte[] code = method.code(); | 238 byte[] code = method.code(); |
239 RiProfilingInfo profilingInfo = method.profilingInfo(); | |
239 Block current = null; | 240 Block current = null; |
240 int bci = 0; | 241 int bci = 0; |
241 while (bci < code.length) { | 242 while (bci < code.length) { |
242 if (current == null || blockMap[bci] != null) { | 243 if (current == null || blockMap[bci] != null) { |
243 Block b = makeBlock(bci); | 244 Block b = makeBlock(bci); |
280 case IF_ACMPEQ: // fall through | 281 case IF_ACMPEQ: // fall through |
281 case IF_ACMPNE: // fall through | 282 case IF_ACMPNE: // fall through |
282 case IFNULL: // fall through | 283 case IFNULL: // fall through |
283 case IFNONNULL: { | 284 case IFNONNULL: { |
284 current = null; | 285 current = null; |
285 double probability = useBranchPrediction ? method.branchProbability(bci) : -1; | 286 double probability = useBranchPrediction ? profilingInfo.getBranchTakenProbability(bci) : -1; |
286 | 287 |
287 Block b1 = probability == 0.0 ? new DeoptBlock(bci + Bytes.beS2(code, bci + 1)) : makeBlock(bci + Bytes.beS2(code, bci + 1)); | 288 Block b1 = probability == 0.0 ? new DeoptBlock(bci + Bytes.beS2(code, bci + 1)) : makeBlock(bci + Bytes.beS2(code, bci + 1)); |
288 Block b2 = probability == 1.0 ? new DeoptBlock(bci + 3) : makeBlock(bci + 3); | 289 Block b2 = probability == 1.0 ? new DeoptBlock(bci + 3) : makeBlock(bci + 3); |
289 setSuccessors(bci, b1, b2); | 290 setSuccessors(bci, b1, b2); |
290 break; | 291 break; |
349 setSuccessors(bci, b1); | 350 setSuccessors(bci, b1); |
350 canTrap.set(bci); | 351 canTrap.set(bci); |
351 break; | 352 break; |
352 } | 353 } |
353 default: { | 354 default: { |
354 if (canTrap(opcode, bci)) { | 355 if (canTrap(opcode, bci, profilingInfo)) { |
355 canTrap.set(bci); | 356 canTrap.set(bci); |
356 } | 357 } |
357 } | 358 } |
358 } | 359 } |
359 bci += lengthOf(code, bci); | 360 bci += lengthOf(code, bci); |
360 } | 361 } |
361 } | 362 } |
362 | 363 |
363 public boolean canTrap(int opcode, int bci) { | 364 private static boolean canTrap(int opcode, int bci, RiProfilingInfo profilingInfo) { |
364 switch (opcode) { | 365 switch (opcode) { |
365 case INVOKESTATIC: | 366 case INVOKESTATIC: |
366 case INVOKESPECIAL: | 367 case INVOKESPECIAL: |
367 case INVOKEVIRTUAL: | 368 case INVOKEVIRTUAL: |
368 case INVOKEINTERFACE: { | 369 case INVOKEINTERFACE: { |
385 case CALOAD: | 386 case CALOAD: |
386 case SALOAD: | 387 case SALOAD: |
387 case PUTFIELD: | 388 case PUTFIELD: |
388 case GETFIELD: { | 389 case GETFIELD: { |
389 if (GraalOptions.AllowExplicitExceptionChecks) { | 390 if (GraalOptions.AllowExplicitExceptionChecks) { |
390 return method.exceptionProbability(bci) > 0; | 391 return profilingInfo.getImplicitExceptionSeen(bci); |
391 } | 392 } |
392 } | 393 } |
393 } | 394 } |
394 return false; | 395 return false; |
395 } | 396 } |