comparison src/share/vm/ci/ciMethod.cpp @ 1206:87684f1a88b5

6614597: Performance variability in jvm2008 xml.validation Summary: Fix incorrect marking of methods as not compilable. Reviewed-by: never
author kvn
date Mon, 01 Feb 2010 16:49:49 -0800
parents cd37471eaecc
children 576e77447e3c
comparison
equal deleted inserted replaced
1205:5fcfaa1ad96f 1206:87684f1a88b5
434 result.add_receiver(receiver, rcount); 434 result.add_receiver(receiver, rcount);
435 // If we extend profiling to record methods, 435 // If we extend profiling to record methods,
436 // we will set result._method also. 436 // we will set result._method also.
437 } 437 }
438 // Determine call site's morphism. 438 // Determine call site's morphism.
439 // The call site count could be == (receivers_count_total + 1) 439 // The call site count is 0 with known morphism (onlt 1 or 2 receivers)
440 // not only in the case of a polymorphic call but also in the case 440 // or < 0 in the case of a type check failured for checkcast, aastore, instanceof.
441 // when a method data snapshot is taken after the site count was updated 441 // The call site count is > 0 in the case of a polymorphic virtual call.
442 // but before receivers counters were updated. 442 if (morphism > 0 && morphism == result._limit) {
443 if (morphism == result._limit) { 443 // The morphism <= MorphismLimit.
444 // There were no array klasses and morphism <= MorphismLimit. 444 if ((morphism < ciCallProfile::MorphismLimit) ||
445 if (morphism < ciCallProfile::MorphismLimit || 445 (morphism == ciCallProfile::MorphismLimit && count == 0)) {
446 morphism == ciCallProfile::MorphismLimit && 446 #ifdef ASSERT
447 (receivers_count_total+1) >= count) { 447 if (count > 0) {
448 tty->print_cr("bci: %d", bci);
449 this->print_codes();
450 assert(false, "this call site should not be polymorphic");
451 }
452 #endif
448 result._morphism = morphism; 453 result._morphism = morphism;
449 } 454 }
450 } 455 }
451 // Make the count consistent if this is a call profile. If count is 456 // Make the count consistent if this is a call profile. If count is
452 // zero or less, presume that this is a typecheck profile and 457 // zero or less, presume that this is a typecheck profile and
453 // do nothing. Otherwise, increase count to be the sum of all 458 // do nothing. Otherwise, increase count to be the sum of all
454 // receiver's counts. 459 // receiver's counts.
455 if (count > 0) { 460 if (count >= 0) {
456 if (count < receivers_count_total) { 461 count += receivers_count_total;
457 count = receivers_count_total;
458 }
459 } 462 }
460 } 463 }
461 result._count = count; 464 result._count = count;
462 } 465 }
463 } 466 }