From 11f3ac4911c6440c33b1c7feb2e9b3dd544330c1 Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Tue, 10 Feb 2015 14:49:07 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/cfghooks.c | 3 +++ gcc/testsuite/gcc.dg/torture/pr64326.c | 30 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr64326.c 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 + + PR tree-optimization/64326 + * cfghooks.c (make_forwarder_block): Cap frequency of created block. + 2015-02-10 Rainer Emrich 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; + } + } +} +