aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-02-22 10:45:42 +0100
committerMartin Liska <marxin@gcc.gnu.org>2017-02-22 09:45:42 +0000
commit8f4f841a3e443d7de88fcb76075eb3003f280bd7 (patch)
treea8803c5b92290a769e7f66b6b708020cbf81bcd4
parentbac4371a6ac451bd5f8b305610eb47fcb9bda3a9 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/data-streamer-in.c1
-rw-r--r--gcc/data-streamer-out.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/pr79587.c26
-rw-r--r--gcc/value-prof.c12
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);
}