From: rguenth Date: Fri, 4 Aug 2017 10:33:39 +0000 (+0000) Subject: 2017-08-04 Richard Biener X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=846c0a706ae22c369d6dfd2817bc7fa48c602a31;p=thirdparty%2Fgcc.git 2017-08-04 Richard Biener PR middle-end/81705 * fold-const.c (fold_binary_loc): Properly restrict minus_var0 && minus_var1 case when associating undefined overflow entities. * c-c++-common/ubsan/pr81705.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250866 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 921430208447..d9c0b0a35796 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-08-04 Richard Biener + + PR middle-end/81705 + * fold-const.c (fold_binary_loc): Properly restrict + minus_var0 && minus_var1 case when associating undefined overflow + entities. + 2017-08-04 Tom de Vries * omp-simd-clone.c (simd_clone_adjust): Add missing edge probability. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ed6c289a64b5..53428b89454e 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9592,12 +9592,13 @@ fold_binary_loc (location_t loc, if (POINTER_TYPE_P (atype) || (INTEGRAL_TYPE_P (atype) && !TYPE_OVERFLOW_WRAPS (atype))) { - if (var0 && var1) + if ((var0 && var1) || (minus_var0 && minus_var1)) { /* ??? If split_tree would handle NEGATE_EXPR we could - simplify this down to the var0/minus_var1 cases. */ - tree tmp0 = var0; - tree tmp1 = var1; + simply reject these cases and the allowed cases would + be the var0/minus_var1 ones. */ + tree tmp0 = var0 ? var0 : minus_var0; + tree tmp1 = var1 ? var1 : minus_var1; bool one_neg = false; if (TREE_CODE (tmp0) == NEGATE_EXPR) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1033cc7b1c36..f5ec59d754bf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-08-04 Richard Biener + + PR middle-end/81705 + * c-c++-common/ubsan/pr81705.c: New testcase. + 2017-08-03 Bill Schmidt * gcc.target/powerpc/bfp/scalar-cmp-exp-eq-2.c: Adjust for error diff --git a/gcc/testsuite/c-c++-common/ubsan/pr81705.c b/gcc/testsuite/c-c++-common/ubsan/pr81705.c new file mode 100644 index 000000000000..081c741c2066 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr81705.c @@ -0,0 +1,12 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=undefined -fsanitize-undefined-trap-on-error" } */ + +int var_4 = -1716607962; +int var_14 = 943738830; +volatile int a; +int main() +{ + // (-(-1716607962) - 516151698) - -(9403738830) + a = (-var_4 - 516151698) - -var_14; + return 0; +}