aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2023-03-14 18:53:16 +0100
committerMartin Jambor <mjambor@suse.cz>2023-03-14 18:56:13 +0100
commit68ba253bda74d6c6e77726d98184a6faee5e7337 (patch)
treeb859ac40a8b5e034842fe6bdec2cbf8342835ead
parent4bcc3b5cc87505d13cda82846db2e223a9b41f79 (diff)
downloadgcc-68ba253bda74d6c6e77726d98184a6faee5e7337.zip
gcc-68ba253bda74d6c6e77726d98184a6faee5e7337.tar.gz
gcc-68ba253bda74d6c6e77726d98184a6faee5e7337.tar.bz2
ipa-cp: Fix various issues in update_specialized_profile (PR 107925)
The patch below fixes various issues in function update_specialized_profile. The main is removal of the assert which is bogus in the case of recursive cloning. The division of unexplained counts is guesswork, which then leads to updates of counts of recursive edges, which then can be redirected to the new clone and their count subtracted from the count and there simply may not be enough left in the count of the original node - especially when we clone a lot because of using --param ipa-cp-eval-threshold=1. The other issue was omission to drop the count of the original node to ipa count. And when calculating the remainder, we should use lenient_count_portion_handling to account for partial train runs. Finally, the patch adds dumping of the original count which I think is useful. gcc/ChangeLog: 2023-02-17 Martin Jambor <mjambor@suse.cz> PR ipa/107925 * ipa-cp.cc (update_specialized_profile): Drop orig_node_count to ipa count, remove assert, lenient_count_portion_handling, dump also orig_node_count.
-rw-r--r--gcc/ipa-cp.cc10
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
index 4b8dedc..5a6b41c 100644
--- a/gcc/ipa-cp.cc
+++ b/gcc/ipa-cp.cc
@@ -5093,22 +5093,24 @@ update_specialized_profile (struct cgraph_node *new_node,
profile_count redirected_sum)
{
struct cgraph_edge *cs;
- profile_count new_node_count, orig_node_count = orig_node->count;
+ profile_count new_node_count, orig_node_count = orig_node->count.ipa ();
if (dump_file)
{
fprintf (dump_file, " the sum of counts of redirected edges is ");
redirected_sum.dump (dump_file);
+ fprintf (dump_file, "\n old ipa count of the original node is ");
+ orig_node_count.dump (dump_file);
fprintf (dump_file, "\n");
}
if (!(orig_node_count > profile_count::zero ()))
return;
- gcc_assert (orig_node_count >= redirected_sum);
-
new_node_count = new_node->count;
new_node->count += redirected_sum;
- orig_node->count -= redirected_sum;
+ orig_node->count
+ = lenient_count_portion_handling (orig_node->count - redirected_sum,
+ orig_node);
for (cs = new_node->callees; cs; cs = cs->next_callee)
cs->count += cs->count.apply_scale (redirected_sum, new_node_count);