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:
parent
e4c2ac365c
commit
11f3ac4911
@ -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
|
||||
|
@ -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);
|
||||
|
30
gcc/testsuite/gcc.dg/torture/pr64326.c
Normal file
30
gcc/testsuite/gcc.dg/torture/pr64326.c
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user