comparison src/share/vm/opto/parse2.cpp @ 2481:3a808be061ff

6988308: assert((cnt > 0.0f) && (prob > 0.0f)) failed: Bad frequency assignment in if Summary: Make sure cnt doesn't become negative and integer overflow doesn't happen. Reviewed-by: kvn, twisti
author iveresov
date Wed, 13 Apr 2011 14:33:03 -0700
parents 1d1603768966
children c124e2e7463e
comparison
equal deleted inserted replaced
2480:4b95bbb36464 2481:3a808be061ff
793 793
794 // scale the counts to be commensurate with invocation counts: 794 // scale the counts to be commensurate with invocation counts:
795 taken = method()->scale_count(taken); 795 taken = method()->scale_count(taken);
796 not_taken = method()->scale_count(not_taken); 796 not_taken = method()->scale_count(not_taken);
797 797
798 // Give up if too few counts to be meaningful 798 // Give up if too few (or too many, in which case the sum will overflow) counts to be meaningful.
799 if (taken + not_taken < 40) { 799 // We also check that individual counters are positive first, overwise the sum can become positive.
800 if (taken < 0 || not_taken < 0 || taken + not_taken < 40) {
800 if (C->log() != NULL) { 801 if (C->log() != NULL) {
801 C->log()->elem("branch target_bci='%d' taken='%d' not_taken='%d'", iter().get_dest(), taken, not_taken); 802 C->log()->elem("branch target_bci='%d' taken='%d' not_taken='%d'", iter().get_dest(), taken, not_taken);
802 } 803 }
803 return PROB_UNKNOWN; 804 return PROB_UNKNOWN;
804 } 805 }
805 806
806 // Compute frequency that we arrive here 807 // Compute frequency that we arrive here
807 int sum = taken + not_taken; 808 float sum = taken + not_taken;
808 // Adjust, if this block is a cloned private block but the 809 // Adjust, if this block is a cloned private block but the
809 // Jump counts are shared. Taken the private counts for 810 // Jump counts are shared. Taken the private counts for
810 // just this path instead of the shared counts. 811 // just this path instead of the shared counts.
811 if( block()->count() > 0 ) 812 if( block()->count() > 0 )
812 sum = block()->count(); 813 sum = block()->count();
813 cnt = (float)sum / (float)FreqCountInvocations; 814 cnt = sum / FreqCountInvocations;
814 815
815 // Pin probability to sane limits 816 // Pin probability to sane limits
816 float prob; 817 float prob;
817 if( !taken ) 818 if( !taken )
818 prob = (0+PROB_MIN) / 2; 819 prob = (0+PROB_MIN) / 2;