cap frequency in make_forwarder_block

In the testcase the block with problematic frequency has to incoming
edges.  Each edge has probability 1.  The first edge's source bb has
frequency 873/10000, and the second has a frequency of 9409/10000.  So
at least one of those is slightly high probably from some sort of rounding
issue related to fixed point, but in any case make_forwarder_block
should not create basic blocks with frequency greater than BB_FREQ_MAX.

gcc/

	PR tree-optimization/64326
	* cfghooks.c (make_forwarder_block): Cap frequency of created
	basic block.

From-SVN: r220585
This commit is contained in:
Trevor Saunders 2015-02-10 14:49:07 +00:00 committed by Trevor Saunders
parent e4c2ac365c
commit 11f3ac4911
3 changed files with 38 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2015-02-10 Trevor Saunders <tsaunders@mozilla.com>
PR tree-optimization/64326
* cfghooks.c (make_forwarder_block): Cap frequency of created block.
2015-02-10 Rainer Emrich <rainer@emrich-ebersheim.de>
PR gcov-profile/61889

View File

@ -863,6 +863,9 @@ make_forwarder_block (basic_block bb, bool (*redirect_edge_p) (edge),
if (redirect_edge_p (e))
{
dummy->frequency += EDGE_FREQUENCY (e);
if (dummy->frequency > BB_FREQ_MAX)
dummy->frequency = BB_FREQ_MAX;
dummy->count += e->count;
fallthru->count += e->count;
ei_next (&ei);

View File

@ -0,0 +1,30 @@
/* { dg-do compile } */
int a, b, c, d, e, f[5][2];
char g;
int
fn1 ()
{
return d && c ? 0 : 1;
}
int
fn2 ()
{
int h;
for (;;)
for (; e;)
{
int i, j;
h = a ? 1 : b;
if (h || fn1 () ^ g - 682)
{
for (i = 0; i < 5; i++)
for (j = 0; j < 2; j++)
f[i][j] = 0;
return 0;
}
}
}