aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-11-16 11:36:04 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2017-11-16 10:36:04 +0000
commit692dc070ff8a4995a850bda7acde3f3fc778f329 (patch)
tree12edf21e1ddd62fe4273fa6cf611ae9887b3ef2f /gcc
parente7b655e8fdf3c32e01a97588445211254c52b6c2 (diff)
downloadgcc-692dc070ff8a4995a850bda7acde3f3fc778f329.zip
gcc-692dc070ff8a4995a850bda7acde3f3fc778f329.tar.gz
gcc-692dc070ff8a4995a850bda7acde3f3fc778f329.tar.bz2
cfgloopanal.c: Include sreal.h
* cfgloopanal.c: Include sreal.h (average_num_loop_insns): Use counts and sreal for accounting. From-SVN: r254807
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgloopanal.c21
2 files changed, 16 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 452a9a4..e3bf8ee 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2017-11-14 Jan Hubicka <hubicka@ucw.cz>
+ * cfgloopanal.c: Include sreal.h
+ (average_num_loop_insns): Use counts and sreal for accounting.
+
+2017-11-14 Jan Hubicka <hubicka@ucw.cz>
+
* cfgloopmanip.c (duplicate_loop_to_header_edge): Cleanup profile
manipulation.
diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c
index 78a3c93..63f7eab 100644
--- a/gcc/cfgloopanal.c
+++ b/gcc/cfgloopanal.c
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#include "expr.h"
#include "graphds.h"
#include "params.h"
+#include "sreal.h"
struct target_cfgloop default_target_cfgloop;
#if SWITCHABLE_TARGET
@@ -199,7 +200,8 @@ int
average_num_loop_insns (const struct loop *loop)
{
basic_block *bbs, bb;
- unsigned i, binsns, ninsns, ratio;
+ unsigned i, binsns;
+ sreal ninsns;
rtx_insn *insn;
ninsns = 0;
@@ -213,19 +215,18 @@ average_num_loop_insns (const struct loop *loop)
if (NONDEBUG_INSN_P (insn))
binsns++;
- ratio = loop->header->count.to_frequency (cfun) == 0
- ? BB_FREQ_MAX
- : (bb->count.to_frequency (cfun) * BB_FREQ_MAX)
- / loop->header->count.to_frequency (cfun);
- ninsns += binsns * ratio;
+ ninsns += (sreal)binsns * bb->count.to_sreal_scale (loop->header->count);
+ /* Avoid overflows. */
+ if (ninsns > 1000000)
+ return 100000;
}
free (bbs);
- ninsns /= BB_FREQ_MAX;
- if (!ninsns)
- ninsns = 1; /* To avoid division by zero. */
+ int64_t ret = ninsns.to_int ();
+ if (!ret)
+ ret = 1; /* To avoid division by zero. */
- return ninsns;
+ return ret;
}
/* Returns expected number of iterations of LOOP, according to