diff options
author | tbsaunde <tbsaunde@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-10 14:49:07 +0000 |
---|---|---|
committer | tbsaunde <tbsaunde@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-02-10 14:49:07 +0000 |
commit | d55cde62072934a5528425781334c54a6d924d14 (patch) | |
tree | c648c0344bfd851dbc0fa243f942821d987a4db9 /gcc | |
parent | fe504175b53780c0ebbbef009ff29f0ed9c4592f (diff) | |
download | gcc-d55cde62072934a5528425781334c54a6d924d14.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220585 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cfghooks.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr64326.c | 30 |
3 files changed, 38 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 72fbdd70da5..50fa380fe06 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/cfghooks.c b/gcc/cfghooks.c index 4b572801693..abeab8cf1a5 100644 --- a/gcc/cfghooks.c +++ b/gcc/cfghooks.c @@ -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); diff --git a/gcc/testsuite/gcc.dg/torture/pr64326.c b/gcc/testsuite/gcc.dg/torture/pr64326.c new file mode 100644 index 00000000000..88ebf35d5c5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr64326.c @@ -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; + } + } +} + |