And there's a single patch that I'll install after bootstrap and regression tests.
Martin
>From cc7922d08b8b5234758e31e2d91557fd7f6cac9b Mon Sep 17 00:00:00 2001 From: marxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Wed, 22 Feb 2017 09:45:42 +0000 Subject: [PATCH] Backport r245647 gcc/ChangeLog: 2017-02-22 Martin Liska <mli...@suse.cz> PR lto/79587 * data-streamer-in.c (streamer_read_gcov_count): Remove assert. * data-streamer-out.c (streamer_write_gcov_count_stream): Likewise. * value-prof.c (stream_out_histogram_value): Make assert more precise based on type of counter. gcc/testsuite/ChangeLog: 2017-02-22 Martin Liska <mli...@suse.cz> PR lto/79587 * gcc.dg/tree-prof/pr79587.c: New test. --- gcc/data-streamer-in.c | 1 - gcc/data-streamer-out.c | 1 - gcc/testsuite/gcc.dg/tree-prof/pr79587.c | 26 ++++++++++++++++++++++++++ gcc/value-prof.c | 12 +++++++++++- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-prof/pr79587.c diff --git a/gcc/data-streamer-in.c b/gcc/data-streamer-in.c index 424d52295fa..fec20ea59c4 100644 --- a/gcc/data-streamer-in.c +++ b/gcc/data-streamer-in.c @@ -206,6 +206,5 @@ gcov_type streamer_read_gcov_count (struct lto_input_block *ib) { gcov_type ret = streamer_read_hwi (ib); - gcc_assert (ret >= 0); return ret; } diff --git a/gcc/data-streamer-out.c b/gcc/data-streamer-out.c index caee0c6a464..ac2c1d64bcd 100644 --- a/gcc/data-streamer-out.c +++ b/gcc/data-streamer-out.c @@ -363,7 +363,6 @@ streamer_write_hwi_stream (struct lto_output_stream *obs, HOST_WIDE_INT work) void streamer_write_gcov_count_stream (struct lto_output_stream *obs, gcov_type work) { - gcc_assert (work >= 0); gcc_assert ((HOST_WIDE_INT) work == work); streamer_write_hwi_stream (obs, work); } diff --git a/gcc/testsuite/gcc.dg/tree-prof/pr79587.c b/gcc/testsuite/gcc.dg/tree-prof/pr79587.c new file mode 100644 index 00000000000..517e0819919 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/pr79587.c @@ -0,0 +1,26 @@ +/* { dg-require-effective-target lto } */ +/* { dg-options "-O2 -flto" } */ + +unsigned long global = -12345; + +unsigned long +__attribute__((noinline)) +test(unsigned long v, unsigned long v2) +{ + unsigned long x = v % v2; + + return x; +} + +int main(int argc, char **argv) +{ + unsigned long r = 0; + + for (int i = 0; i < 100; i++) + r += test(argc, global); + + if (r != 100) + __builtin_abort (); + + return 0; +} diff --git a/gcc/value-prof.c b/gcc/value-prof.c index b16bce8746a..9d04ee2d6bd 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -431,7 +431,17 @@ stream_out_histogram_value (struct output_block *ob, histogram_value hist) break; } for (i = 0; i < hist->n_counters; i++) - streamer_write_gcov_count (ob, hist->hvalue.counters[i]); + { + /* When user uses an unsigned type with a big value, constant converted + to gcov_type (a signed type) can be negative. */ + gcov_type value = hist->hvalue.counters[i]; + if (hist->type == HIST_TYPE_SINGLE_VALUE && i == 0) + ; + else + gcc_assert (value >= 0); + + streamer_write_gcov_count (ob, value); + } if (hist->hvalue.next) stream_out_histogram_value (ob, hist->hvalue.next); } -- 2.12.0