diff options
author | Martin Liska <mliska@suse.cz> | 2017-02-22 10:45:42 +0100 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2017-02-22 09:45:42 +0000 |
commit | 8f4f841a3e443d7de88fcb76075eb3003f280bd7 (patch) | |
tree | a8803c5b92290a769e7f66b6b708020cbf81bcd4 | |
parent | bac4371a6ac451bd5f8b305610eb47fcb9bda3a9 (diff) | |
download | gcc-8f4f841a3e443d7de88fcb76075eb3003f280bd7.zip gcc-8f4f841a3e443d7de88fcb76075eb3003f280bd7.tar.gz gcc-8f4f841a3e443d7de88fcb76075eb3003f280bd7.tar.bz2 |
Remove wrong assert about gcov_type (PR lto/79587).
2017-02-22 Martin Liska <mliska@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.
2017-02-22 Martin Liska <mliska@suse.cz>
PR lto/79587
* gcc.dg/tree-prof/pr79587.c: New test.
From-SVN: r245647
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/data-streamer-in.c | 1 | ||||
-rw-r--r-- | gcc/data-streamer-out.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-prof/pr79587.c | 26 | ||||
-rw-r--r-- | gcc/value-prof.c | 12 |
6 files changed, 51 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c0f554f..1911946 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-02-22 Martin Liska <mliska@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. + 2017-02-21 Jeff Law <law@redhat.com> PR tree-optimization/79621 diff --git a/gcc/data-streamer-in.c b/gcc/data-streamer-in.c index b38d913..ad32ce1 100644 --- a/gcc/data-streamer-in.c +++ b/gcc/data-streamer-in.c @@ -181,7 +181,6 @@ 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 1ee8c9f..1e8feb1 100644 --- a/gcc/data-streamer-out.c +++ b/gcc/data-streamer-out.c @@ -340,7 +340,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/ChangeLog b/gcc/testsuite/ChangeLog index b76d0a3..19ddc6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-22 Martin Liska <mliska@suse.cz> + + PR lto/79587 + * gcc.dg/tree-prof/pr79587.c: New test. + 2017-02-21 Marek Polacek <polacek@redhat.com> PR c++/79535 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 0000000..517e081 --- /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 097e409..22dc2c9 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -365,7 +365,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); } |