aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/fold-const.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/pr81088.c11
4 files changed, 34 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 11e3533..09a1b98 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2017-06-14 Richard Biener <rguenther@suse.de>
+
+ 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 <ebotcazou@adacore.com>
* 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 74bbdb0..8559b1d 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 d6fdd84..bd241de 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-14 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/81088
+ * c-c++-common/ubsan/pr81088.c: New testcase.
+
2017-06-14 Eric Botcazou <ebotcazou@adacore.com>
* 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 0000000..6753d77
--- /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;
+}