parent
d708ce50e3
commit
444b39959c
|
@ -1,3 +1,8 @@
|
||||||
|
2011-04-19 Xinliang David Li <davidxl@google.com>
|
||||||
|
|
||||||
|
* ipa-cp.c (ipcp_update_profiling): asserting
|
||||||
|
scale_completement is not negative.
|
||||||
|
|
||||||
2011-04-19 Jakub Jelinek <jakub@redhat.com>
|
2011-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR target/48678
|
PR target/48678
|
||||||
|
@ -1652,6 +1657,11 @@
|
||||||
* ipa-cp.c (ipcp_update_profiling): Correct negative scale factor due
|
* ipa-cp.c (ipcp_update_profiling): Correct negative scale factor due
|
||||||
to insane profile data.
|
to insane profile data.
|
||||||
|
|
||||||
|
2011-04-08 Xinliang David Li <davidxl@google.com>
|
||||||
|
|
||||||
|
* ipa-cp.c (ipcp_update_profiling): Correct
|
||||||
|
negative scale factor due to insane profile data.
|
||||||
|
|
||||||
2011-04-08 Xinliang David Li <davidxl@google.com>
|
2011-04-08 Xinliang David Li <davidxl@google.com>
|
||||||
|
|
||||||
* final.c (dump_basic_block_info): New function.
|
* final.c (dump_basic_block_info): New function.
|
||||||
|
|
23
gcc/ipa-cp.c
23
gcc/ipa-cp.c
|
@ -1115,28 +1115,7 @@ ipcp_update_profiling (void)
|
||||||
node->count = orig_node->count * scale / REG_BR_PROB_BASE;
|
node->count = orig_node->count * scale / REG_BR_PROB_BASE;
|
||||||
scale_complement = REG_BR_PROB_BASE - scale;
|
scale_complement = REG_BR_PROB_BASE - scale;
|
||||||
|
|
||||||
/* Negative scale complement can result from insane profile data
|
gcc_assert (scale_complement >= 0);
|
||||||
in which the total incoming edge counts in this module is
|
|
||||||
larger than the callee's entry count. The insane profile data
|
|
||||||
usually gets generated due to the following reasons:
|
|
||||||
|
|
||||||
1) in multithreaded programs, when profile data is dumped
|
|
||||||
to gcda files in gcov_exit, some other threads are still running.
|
|
||||||
The profile counters are dumped in bottom up order (call graph).
|
|
||||||
The caller's BB counters may still be updated while the callee's
|
|
||||||
counter data is already saved to disk.
|
|
||||||
|
|
||||||
2) Comdat functions: comdat functions' profile data are not
|
|
||||||
allocated in comdat. When a comdat callee function gets inlined
|
|
||||||
at some callsites after instrumentation, and the remaining calls
|
|
||||||
to this function resolves to a comdat copy in another module,
|
|
||||||
the profile counters for this function are split. This can
|
|
||||||
result in sum of incoming edge counts from this module being
|
|
||||||
larger than callee instance's entry count. */
|
|
||||||
|
|
||||||
if (scale_complement < 0 && flag_profile_correction)
|
|
||||||
scale_complement = 0;
|
|
||||||
|
|
||||||
orig_node->count =
|
orig_node->count =
|
||||||
orig_node->count * scale_complement / REG_BR_PROB_BASE;
|
orig_node->count * scale_complement / REG_BR_PROB_BASE;
|
||||||
for (cs = node->callees; cs; cs = cs->next_callee)
|
for (cs = node->callees; cs; cs = cs->next_callee)
|
||||||
|
|
Loading…
Reference in New Issue