Hi, this patch drops use of integer bb frequencies in ipa-fnsummary. This avoids capping to 100 for frequency and makes it consistent with edge accounting.
ipcp-2.c needs updating becuase the cumulated time is now more realistic. There is loop iterating 32*32 times and we accounted it as loop iteraitng 100 times. Bootstrapped/regtested x86_64-linux. Comitted. Honza * ipa-fnsummary.c (analyze_function_body): Accumulate time consistently in sreal. * gcc.dg/ipa/ipcp-2.c: Lower threshold. Index: ipa-fnsummary.c =================================================================== --- ipa-fnsummary.c (revision 254812) +++ ipa-fnsummary.c (working copy) @@ -1986,7 +1986,7 @@ analyze_function_body (struct cgraph_nod <0,2>. */ basic_block bb; struct function *my_function = DECL_STRUCT_FUNCTION (node->decl); - int freq; + sreal freq; struct ipa_fn_summary *info = ipa_fn_summaries->get (node); predicate bb_predicate; struct ipa_func_body_info fbi; @@ -2052,7 +2052,7 @@ analyze_function_body (struct cgraph_nod for (n = 0; n < nblocks; n++) { bb = BASIC_BLOCK_FOR_FN (cfun, order[n]); - freq = compute_call_stmt_bb_frequency (node->decl, bb); + freq = bb->count.to_sreal_scale (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count); if (clobber_only_eh_bb_p (bb)) { if (dump_file && (dump_flags & TDF_DETAILS)) @@ -2127,7 +2127,7 @@ analyze_function_body (struct cgraph_nod fprintf (dump_file, " "); print_gimple_stmt (dump_file, stmt, 0); fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n", - ((double) freq) / CGRAPH_FREQ_BASE, this_size, + freq.to_double (), this_size, this_time); } @@ -2201,7 +2201,7 @@ analyze_function_body (struct cgraph_nod will_be_nonconstant = true; if (this_time || this_size) { - this_time *= freq; + sreal final_time = (sreal)this_time * freq; prob = eliminated_by_inlining_prob (stmt); if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS)) @@ -2218,7 +2218,7 @@ analyze_function_body (struct cgraph_nod if (*(is_gimple_call (stmt) ? &bb_predicate : &p) != false) { - time += this_time; + time += final_time; size += this_size; } @@ -2231,14 +2231,12 @@ analyze_function_body (struct cgraph_nod { predicate ip = bb_predicate & predicate::not_inlined (); info->account_size_time (this_size * prob, - (sreal)(this_time * prob) - / (CGRAPH_FREQ_BASE * 2), ip, + (this_time * prob) / 2, ip, p); } if (prob != 2) info->account_size_time (this_size * (2 - prob), - (sreal)(this_time * (2 - prob)) - / (CGRAPH_FREQ_BASE * 2), + (this_time * (2 - prob) / 2), bb_predicate, p); } @@ -2256,7 +2254,6 @@ analyze_function_body (struct cgraph_nod } } set_hint_predicate (&ipa_fn_summaries->get (node)->array_index, array_index); - time = time / CGRAPH_FREQ_BASE; free (order); if (nonconstant_names.exists () && !early) Index: testsuite/gcc.dg/ipa/ipcp-2.c =================================================================== --- testsuite/gcc.dg/ipa/ipcp-2.c (revision 254812) +++ testsuite/gcc.dg/ipa/ipcp-2.c (working copy) @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O3 -fipa-cp -fipa-cp-clone -fdump-ipa-cp -fno-early-inlining --param ipa-cp-eval-threshold=100" } */ +/* { dg-options "-O3 -fipa-cp -fipa-cp-clone -fdump-ipa-cp -fno-early-inlining --param ipa-cp-eval-threshold=80" } */ /* { dg-add-options bind_pic_locally } */ extern int get_stuff (int);