diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-11-06 14:45:41 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-11-06 13:45:41 +0000 |
commit | 8e7d1486f6635614f97e26f27ed8033f647ef6f2 (patch) | |
tree | 48517ad3ae0dc37801c611131c9093c4b7475294 /gcc/tree-inline.c | |
parent | 454f8b2b0c6f9645b3df6be98efe2ca520f2ce82 (diff) | |
download | gcc-8e7d1486f6635614f97e26f27ed8033f647ef6f2.zip gcc-8e7d1486f6635614f97e26f27ed8033f647ef6f2.tar.gz gcc-8e7d1486f6635614f97e26f27ed8033f647ef6f2.tar.bz2 |
re PR bootstrap/82832 (Broken PGO LTO bootstrap on x86_64 after r254379)
PR bootstrap/82832
* ipa-inline-transform.c (update_noncloned_frequencies): Always
scale.
(inline_transform): Likewise.
* predict.c (counts_to_freqs): Remove useless conditional.
* profile-count.h (profile_count::apply_scale): Move sanity check.
* tree-inline.c (copy_bb): Always scale.
(copy_cfg_body): Likewise.
From-SVN: r254452
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 040799c..7ef1072 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1770,8 +1770,18 @@ copy_bb (copy_body_data *id, basic_block bb, basic_block copy_basic_block; tree decl; basic_block prev; - bool scale = !num.initialized_p () - || (den.nonzero_p () || num == profile_count::zero ()); + + /* We always must scale to be sure counters end up compatible. + If den is zero, just force it nonzero and hope for reasonable + approximation. + When num is forced nonzero, also update den, so we do not scale profile + to 0. */ + if (!(num == den) + && !(den.force_nonzero () == den)) + { + den = den.force_nonzero (); + num = num.force_nonzero (); + } /* Search for previous copied basic block. */ prev = bb->prev_bb; @@ -1781,10 +1791,7 @@ copy_bb (copy_body_data *id, basic_block bb, /* create_basic_block() will append every new block to basic_block_info automatically. */ copy_basic_block = create_basic_block (NULL, (basic_block) prev->aux); - if (scale) - copy_basic_block->count = bb->count.apply_scale (num, den); - else if (num.initialized_p ()) - copy_basic_block->count = bb->count; + copy_basic_block->count = bb->count.apply_scale (num, den); copy_gsi = gsi_start_bb (copy_basic_block); @@ -2691,6 +2698,18 @@ copy_cfg_body (copy_body_data * id, profile_count, profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count; profile_count num = entry_block_map->count; + /* We always must scale to be sure counters end up compatible. + If den is zero, just force it nonzero and hope for reasonable + approximation. + When num is forced nonzero, also update den, so we do not scale profile + to 0. */ + if (!(num == den) + && !(den.force_nonzero () == den)) + { + den = den.force_nonzero (); + num = num.force_nonzero (); + } + cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl); /* Register specific tree functions. */ |