From: Jakub Jelinek Date: Wed, 22 Nov 2017 09:08:23 +0000 (+0100) Subject: re PR rtl-optimization/82044 (runtime signed integer overflow in check_mem_read_rtx... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=213ffde2eae0d0ee2c15c7ffc7ef481f4f8bee11;p=gcc.git re PR rtl-optimization/82044 (runtime signed integer overflow in check_mem_read_rtx() and all_positions_needed_p() in dse.c) 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dc96750a2da..f4b05f0eb2f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-11-22 Jakub Jelinek + + 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 * gimple-iterator.c (gimple_find_edge_insert_loc): Ignore diff --git a/gcc/dse.c b/gcc/dse.c index f6d5e6e6fe2..1b34f4f0285 100644 --- 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; }