re PR tree-optimization/83609 (ICE in read_complex_part at gcc/expr.c:3202)
authorJan Hubicka <hubicka@ucw.cz>
Fri, 8 Dec 2017 11:27:28 +0000 (12:27 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 8 Dec 2017 11:27:28 +0000 (11:27 +0000)
* profile-count.c (profile_count::from_gcov_type): Move from
profile-count.h; handle overflow.
* profile-count. (profile_count::from_gcov_type): Move offline.

PR middle-end/83609
* gcc.c-torture/compile/pr83069.c: New testcase.

From-SVN: r255507

gcc/ChangeLog
gcc/profile-count.c
gcc/profile-count.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr83069.c [new file with mode: 0644]

index dcd1fb685331d1a3f0cda09385303eff0819362a..f7fac96d27c12165948c7e53b756fa7ccc697e77 100644 (file)
@@ -1,3 +1,10 @@
+2017-12-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/83609
+       * profile-count.c (profile_count::from_gcov_type): Move from
+       profile-count.h; handle overflow.
+       * profile-count.h (profile_count::from_gcov_type): Move offline.
+
 2017-12-08  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR rtl-optimization/83304
index 5d8e9c55913a3168e5f56db68f4aacada174ecd4..3b106d3f3ca1ef1559f485a0e8b1ce55e54bfff4 100644 (file)
@@ -327,3 +327,21 @@ profile_count::combine_with_ipa_count (profile_count ipa)
     return this->global0 ();
   return this->global0adjusted ();
 }
+
+/* The profiling runtime uses gcov_type, which is usually 64bit integer.
+   Conversions back and forth are used to read the coverage and get it
+   into internal representation.  */
+profile_count
+profile_count::from_gcov_type (gcov_type v)
+  {
+    profile_count ret;
+    gcc_checking_assert (v >= 0);
+    if (dump_file && v >= (gcov_type)max_count)
+      fprintf (dump_file,
+              "Capping gcov count %" PRId64 " to max_count %" PRId64 "\n",
+              (int64_t) v, (int64_t) max_count);
+    ret.m_val = MIN (v, (gcov_type)max_count);
+    ret.m_quality = profile_precise;
+    return ret;
+  }
+
index 2ffa33f639c6ad6be9d1285f010b79c349000bb3..75456ad3586f0acb417b03038e418e2b472876f1 100644 (file)
@@ -667,18 +667,6 @@ public:
       return c;
     }
 
-  /* The profiling runtime uses gcov_type, which is usually 64bit integer.
-     Conversions back and forth are used to read the coverage and get it
-     into internal representation.  */
-  static profile_count from_gcov_type (gcov_type v)
-    {
-      profile_count ret;
-      gcc_checking_assert (v >= 0 && (uint64_t) v <= max_count);
-      ret.m_val = v;
-      ret.m_quality = profile_precise;
-      return ret;
-    }
-
   /* Conversion to gcov_type is lossy.  */
   gcov_type to_gcov_type () const
     {
@@ -1083,6 +1071,11 @@ public:
      global0.  */
   profile_count combine_with_ipa_count (profile_count ipa);
 
+  /* The profiling runtime uses gcov_type, which is usually 64bit integer.
+     Conversions back and forth are used to read the coverage and get it
+     into internal representation.  */
+  static profile_count from_gcov_type (gcov_type v);
+
   /* LTO streaming support.  */
   static profile_count stream_in (struct lto_input_block *);
   void stream_out (struct output_block *);
index 3b1a7e291112402cedf284e01bc2dc8486e94213..cae9220a63d770cfb8597bad82141636e91a1332 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-08  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR middle-end/83609
+       * gcc.c-torture/compile/pr83069.c: New testcase.
+
 2017-12-08  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81303
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr83069.c b/gcc/testsuite/gcc.c-torture/compile/pr83069.c
new file mode 100644 (file)
index 0000000..addb2df
--- /dev/null
@@ -0,0 +1,14 @@
+#define MAX 98
+
+void foo (unsigned long *res, unsigned long in)
+{
+  for (unsigned long a = 0; a < MAX; a++)
+    for (unsigned long b = 0; b < MAX; b++)
+      for (unsigned long c = 0; c < MAX; c++)
+        for (unsigned long d = 0; d < MAX; d++)
+          for (unsigned long e = 0; e < MAX; e++)
+            for (unsigned long f = 0; f < MAX; f++)
+              for (unsigned long g = 0; g < MAX; g++)
+                *res += a * in;
+}
+