re PR rtl-optimization/82044 (runtime signed integer overflow in check_mem_read_rtx...
authorJakub Jelinek <jakub@redhat.com>
Wed, 22 Nov 2017 09:08:23 +0000 (10:08 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 22 Nov 2017 09:08:23 +0000 (10:08 +0100)
PR rtl-optimization/82044
PR tree-optimization/82042
* dse.c (record_store): Check for overflow.
(check_mem_read_rtx): Properly check for overflow if width == -1, call
add_wild_read instead of clear_rhs_from_active_local_stores on
overflow and log it into dump_file.

From-SVN: r255048

gcc/ChangeLog
gcc/dse.c

index dc96750a2da35c91c0482268713bb648796f3f97..f4b05f0eb2fa661cf3d7a07baf9706be709acf6f 100644 (file)
@@ -1,3 +1,12 @@
+2017-11-22  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/82044
+       PR tree-optimization/82042
+       * dse.c (record_store): Check for overflow.
+       (check_mem_read_rtx): Properly check for overflow if width == -1, call
+       add_wild_read instead of clear_rhs_from_active_local_stores on
+       overflow and log it into dump_file.
+
 2017-11-22  Richard Biener  <rguenther@suse.de>
 
        * gimple-iterator.c (gimple_find_edge_insert_loc): Ignore
index f6d5e6e6fe26d7bace5f393c982ac0dfb0e7491b..1b34f4f028531e02b111613c4086dbaea9aaedb9 100644 (file)
--- a/gcc/dse.c
+++ b/gcc/dse.c
@@ -1342,6 +1342,12 @@ record_store (rtx body, bb_info_t bb_info)
   else
     width = GET_MODE_SIZE (GET_MODE (mem));
 
+  if (offset > HOST_WIDE_INT_MAX - width)
+    {
+      clear_rhs_from_active_local_stores ();
+      return 0;
+    }
+
   if (group_id >= 0)
     {
       /* In the restrictive case where the base is a constant or the
@@ -1981,9 +1987,13 @@ check_mem_read_rtx (rtx *loc, bb_info_t bb_info)
   else
     width = GET_MODE_SIZE (GET_MODE (mem));
 
-  if (offset > HOST_WIDE_INT_MAX - width)
+  if (width == -1
+      ? offset == HOST_WIDE_INT_MIN
+      : offset > HOST_WIDE_INT_MAX - width)
     {
-      clear_rhs_from_active_local_stores ();
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, " adding wild read, due to overflow.\n");
+      add_wild_read (bb_info);
       return;
     }