aboutsummaryrefslogtreecommitdiff
path: root/gcc/match.pd
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-01-15 10:05:59 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2018-01-15 10:05:59 +0100
commit3fccbb9ecec7daa3b6468f72379c0bd1fb5bb8d9 (patch)
tree08c17fa7abe77e42e46b0fdf6d49c9bdf48fc9a0 /gcc/match.pd
parent2aa89839f557b7467704ddffa4dc43a130e8d027 (diff)
downloadgcc-3fccbb9ecec7daa3b6468f72379c0bd1fb5bb8d9.zip
gcc-3fccbb9ecec7daa3b6468f72379c0bd1fb5bb8d9.tar.gz
gcc-3fccbb9ecec7daa3b6468f72379c0bd1fb5bb8d9.tar.bz2
re PR middle-end/82694 (Linux kernel miscompiled since r250765)
PR middle-end/82694 * common.opt (fstrict-overflow): No longer an alias. (fwrapv-pointer): New option. * tree.h (TYPE_OVERFLOW_WRAPS, TYPE_OVERFLOW_UNDEFINED): Define also for pointer types based on flag_wrapv_pointer. * opts.c (common_handle_option) <case OPT_fstrict_overflow>: Set opts->x_flag_wrap[pv] to !value, clear opts->x_flag_trapv if opts->x_flag_wrapv got set. * fold-const.c (fold_comparison, fold_binary_loc): Revert 2017-08-01 changes, just use TYPE_OVERFLOW_UNDEFINED on pointer type instead of POINTER_TYPE_OVERFLOW_UNDEFINED. * match.pd: Likewise in address comparison pattern. * doc/invoke.texi: Document -fwrapv and -fstrict-overflow. * gcc.dg/no-strict-overflow-7.c: Revert 2017-08-01 changes. * gcc.dg/tree-ssa/pr81388-1.c: Likewise. From-SVN: r256686
Diffstat (limited to 'gcc/match.pd')
-rw-r--r--gcc/match.pd9
1 files changed, 8 insertions, 1 deletions
diff --git a/gcc/match.pd b/gcc/match.pd
index 435125a..3f6e009 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -3610,7 +3610,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
|| TREE_CODE (base1) == STRING_CST))
equal = (base0 == base1);
}
- (if (equal == 1)
+ (if (equal == 1
+ && (cmp == EQ_EXPR || cmp == NE_EXPR
+ /* If the offsets are equal we can ignore overflow. */
+ || known_eq (off0, off1)
+ || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (@0))
+ /* Or if we compare using pointers to decls or strings. */
+ || (POINTER_TYPE_P (TREE_TYPE (@2))
+ && (DECL_P (base0) || TREE_CODE (base0) == STRING_CST))))
(switch
(if (cmp == EQ_EXPR && (known_eq (off0, off1) || known_ne (off0, off1)))
{ constant_boolean_node (known_eq (off0, off1), type); })