re PR middle-end/80362 (gcc miscompiles arithmetic with signed char)
authorRichard Biener <rguenther@suse.de>
Mon, 10 Apr 2017 13:02:12 +0000 (13:02 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 10 Apr 2017 13:02:12 +0000 (13:02 +0000)
2017-04-10  Richard Biener  <rguenther@suse.de>

PR middle-end/80362
* fold-const.c (fold_binary_loc): Look at unstripped ops when
looking for NEGATE_EXPR in -A / -B to A / B folding.

* gcc.dg/torture/pr80362.c: New testcase.

From-SVN: r246805

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr80362.c [new file with mode: 0644]

index 1e03c02ad29637933f6d53c6720e91eebd70af5f..4a72cf63294cc9407858ede9b8a377d7ca2976c8 100644 (file)
@@ -1,3 +1,9 @@
+2017-04-10  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/80362
+       * fold-const.c (fold_binary_loc): Look at unstripped ops when
+       looking for NEGATE_EXPR in -A / -B to A / B folding.
+
 2017-04-10  Martin Liska  <mliska@suse.cz>
 
        PR gcov-profile/80224
index b4c117c84948f6994c2ac0354b76ce8d393eb2b4..524bb0fe3fbdfb8993e48e827d3bed1eab17561d 100644 (file)
@@ -10205,7 +10205,7 @@ fold_binary_loc (location_t loc,
       /* Convert -A / -B to A / B when the type is signed and overflow is
         undefined.  */
       if ((!INTEGRAL_TYPE_P (type) || TYPE_OVERFLOW_UNDEFINED (type))
-         && TREE_CODE (arg0) == NEGATE_EXPR
+         && TREE_CODE (op0) == NEGATE_EXPR
          && negate_expr_p (op1))
        {
          if (INTEGRAL_TYPE_P (type))
index d579a09067e0276c229195fa7799bf034a98b431..f71cb1a30aa70388f8a035ee18f7a62a07cdb8e1 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-10  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/80362
+       * gcc.dg/torture/pr80362.c: New testcase.
+
 2017-04-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/80304
diff --git a/gcc/testsuite/gcc.dg/torture/pr80362.c b/gcc/testsuite/gcc.dg/torture/pr80362.c
new file mode 100644 (file)
index 0000000..6d22eb0
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fstrict-overflow" } */
+
+int main()
+{
+  signed char var_0, var_1 = -128;
+  var_0 = (signed char)(-var_1) / 3;
+  if (var_0 > 0)
+    __builtin_abort();
+}