Commit e4373d41 by Jan Hubicka Committed by Jan Hubicka

re PR ipa/82879 (ICE in max, at profile-count.h:889)


	PR ipa/82879
	* ipa-inline-transform.c (update_noncloned_frequencies): Use
	profile_count::adjust_for_ipa_scaling.
	* tree-inline.c (copy_bb, copy_cfg_body): Likewise.
	* profile-count.c (profile_count::adjust_for_ipa_scaling): New member
	function.
	* profile-count.h (profile_count::adjust_for_ipa_scaling): Declare.

From-SVN: r254582
parent a3a6d41f
2017-11-09 Jan Hubicka <hubicka@ucw.cz>
PR ipa/82879
* ipa-inline-transform.c (update_noncloned_frequencies): Use
profile_count::adjust_for_ipa_scaling.
* tree-inline.c (copy_bb, copy_cfg_body): Likewise.
* profile-count.c (profile_count::adjust_for_ipa_scaling): New member
function.
* profile-count.h (profile_count::adjust_for_ipa_scaling): Declare.
2017-11-09 Jakub Jelinek <jakub@redhat.com> 2017-11-09 Jakub Jelinek <jakub@redhat.com>
* gimple-ssa-store-merging.c (count_multiple_uses): New function. * gimple-ssa-store-merging.c (count_multiple_uses): New function.
...@@ -60,17 +60,7 @@ update_noncloned_frequencies (struct cgraph_node *node, ...@@ -60,17 +60,7 @@ update_noncloned_frequencies (struct cgraph_node *node,
{ {
struct cgraph_edge *e; struct cgraph_edge *e;
/* We always must scale to be sure counters end up compatible. profile_count::adjust_for_ipa_scaling (&num, &den);
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 ();
}
/* We do not want to ignore high loop nest after freq drops to 0. */ /* We do not want to ignore high loop nest after freq drops to 0. */
if (!freq_scale) if (!freq_scale)
......
...@@ -255,3 +255,29 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const ...@@ -255,3 +255,29 @@ profile_count::to_cgraph_frequency (profile_count entry_bb_count) const
return CGRAPH_FREQ_MAX; return CGRAPH_FREQ_MAX;
return MIN (scale, CGRAPH_FREQ_MAX); return MIN (scale, CGRAPH_FREQ_MAX);
} }
/* We want to scale profile across function boundary from NUM to DEN.
Take care of the side case when DEN is zeros. We still want to behave
sanely here which means
- scale to profile_count::zero () if NUM is profile_count::zero
- do not affect anything if NUM == DEN
- preserve counter value but adjust quality in other cases. */
void
profile_count::adjust_for_ipa_scaling (profile_count *num,
profile_count *den)
{
/* Scaling is no-op if NUM and DEN are the same. */
if (*num == *den)
return;
/* Scaling to zero is always zeor. */
if (*num == profile_count::zero ())
return;
/* If den is non-zero we are safe. */
if (den->force_nonzero () == *den)
return;
/* Force both to non-zero so we do not push profiles to 0 when
both num == 0 and den == 0. */
*den = den->force_nonzero ();
*num = num->force_nonzero ();
}
...@@ -1044,6 +1044,11 @@ public: ...@@ -1044,6 +1044,11 @@ public:
/* Return true if THIS is known to differ significantly from OTHER. */ /* Return true if THIS is known to differ significantly from OTHER. */
bool differs_from_p (profile_count other) const; bool differs_from_p (profile_count other) const;
/* We want to scale profile across function boundary from NUM to DEN.
Take care of the side case when NUM and DEN are zeros of incompatible
kinds. */
static void adjust_for_ipa_scaling (profile_count *num, profile_count *den);
/* LTO streaming support. */ /* LTO streaming support. */
static profile_count stream_in (struct lto_input_block *); static profile_count stream_in (struct lto_input_block *);
void stream_out (struct output_block *); void stream_out (struct output_block *);
......
2017-11-09 Jan Hubicka <hubicka@ucw.cz>
* gcc.c-torture/compile/pr82879.c: New testcase.
2017-11-09 Richard Biener <rguenther@suse.de> 2017-11-09 Richard Biener <rguenther@suse.de>
PR tree-optimization/82902 PR tree-optimization/82902
......
int a, b;
static __attribute__((cold)) void fn1() {
for (;;)
for (; a;)
;
}
void fn2() {
if (b)
fn1();
}
...@@ -1771,17 +1771,7 @@ copy_bb (copy_body_data *id, basic_block bb, ...@@ -1771,17 +1771,7 @@ copy_bb (copy_body_data *id, basic_block bb,
tree decl; tree decl;
basic_block prev; basic_block prev;
/* We always must scale to be sure counters end up compatible. profile_count::adjust_for_ipa_scaling (&num, &den);
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. */ /* Search for previous copied basic block. */
prev = bb->prev_bb; prev = bb->prev_bb;
...@@ -2698,17 +2688,7 @@ copy_cfg_body (copy_body_data * id, profile_count, ...@@ -2698,17 +2688,7 @@ copy_cfg_body (copy_body_data * id, profile_count,
profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count; profile_count den = ENTRY_BLOCK_PTR_FOR_FN (src_cfun)->count;
profile_count num = entry_block_map->count; profile_count num = entry_block_map->count;
/* We always must scale to be sure counters end up compatible. profile_count::adjust_for_ipa_scaling (&num, &den);
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); cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment