From: Richard Biener Date: Wed, 14 Jun 2017 11:40:20 +0000 (+0000) Subject: re PR middle-end/81088 (UBSAN: false positive as a result of reassosiation) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=909263f855ae056b49b8fbbbcf594d7e9b90b434;p=gcc.git re PR middle-end/81088 (UBSAN: false positive as a result of reassosiation) 2017-06-14 Richard Biener PR middle-end/81088 * fold-const.c (split_tree): Drop TREE_OVERFLOW flag from literal constants. (fold_binary_loc): When associating do not treat pre-existing TREE_OVERFLOW on literal constants as a reason to allow TREE_OVERFLOW on associated literal constants. * c-c++-common/ubsan/pr81088.c: New testcase. From-SVN: r249192 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 11e3533d4f9..09a1b983584 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-06-14 Richard Biener + + PR middle-end/81088 + * fold-const.c (split_tree): Drop TREE_OVERFLOW flag from + literal constants. + (fold_binary_loc): When associating do not treat pre-existing + TREE_OVERFLOW on literal constants as a reason to allow + TREE_OVERFLOW on associated literal constants. + 2017-06-14 Eric Botcazou * config/sparc/sparc.h (MASK_ISA): Add MASK_LEON and MASK_LEON3. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 74bbdb07ffb..8559b1d0731 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -880,6 +880,13 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, } } + if (*litp + && TREE_OVERFLOW_P (*litp)) + *litp = drop_tree_overflow (*litp); + if (*minus_litp + && TREE_OVERFLOW_P (*minus_litp)) + *minus_litp = drop_tree_overflow (*minus_litp); + return var; } @@ -9703,11 +9710,6 @@ fold_binary_loc (location_t loc, + (lit0 != 0) + (lit1 != 0) + (minus_lit0 != 0) + (minus_lit1 != 0)))) { - bool any_overflows = false; - if (lit0) any_overflows |= TREE_OVERFLOW (lit0); - if (lit1) any_overflows |= TREE_OVERFLOW (lit1); - if (minus_lit0) any_overflows |= TREE_OVERFLOW (minus_lit0); - if (minus_lit1) any_overflows |= TREE_OVERFLOW (minus_lit1); var0 = associate_trees (loc, var0, var1, code, atype); con0 = associate_trees (loc, con0, con1, code, atype); lit0 = associate_trees (loc, lit0, lit1, code, atype); @@ -9738,9 +9740,8 @@ fold_binary_loc (location_t loc, } /* Don't introduce overflows through reassociation. */ - if (!any_overflows - && ((lit0 && TREE_OVERFLOW_P (lit0)) - || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0)))) + if ((lit0 && TREE_OVERFLOW_P (lit0)) + || (minus_lit0 && TREE_OVERFLOW_P (minus_lit0))) return NULL_TREE; if (minus_lit0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d6fdd845dd2..bd241de4779 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-06-14 Richard Biener + + PR middle-end/81088 + * c-c++-common/ubsan/pr81088.c: New testcase. + 2017-06-14 Eric Botcazou * gcc.target/sparc/overflow-4.c: Add -mno-vis3. diff --git a/gcc/testsuite/c-c++-common/ubsan/pr81088.c b/gcc/testsuite/c-c++-common/ubsan/pr81088.c new file mode 100644 index 00000000000..6753d77fbad --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/pr81088.c @@ -0,0 +1,11 @@ +/* { dg-do run } */ +/* { dg-options "-fsanitize=undefined -fsanitize-undefined-trap-on-error" } */ + +short s = 2; +short y = 1; +int i; +int main() +{ + i = -(s + (int)(~(unsigned)(0 / y))) + 0x7fffffff; + return 0; +}