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 }