fold-const.c (fold_unary_loc): Do not strip sign-changes for NEGATE_EXPR.
authorRichard Guenther <rguenther@suse.de>
Thu, 7 Jul 2011 14:21:21 +0000 (14:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 7 Jul 2011 14:21:21 +0000 (14:21 +0000)
2011-07-07  Richard Guenther  <rguenther@suse.de>

* fold-const.c (fold_unary_loc): Do not strip sign-changes
for NEGATE_EXPR.

* gcc.dg/ftrapv-3.c: New testcase.

From-SVN: r175976

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

index f3b7c1106c52831e7c4bb54d4d9a583d4541ae62..7a7c0ecdd535cce14c506447212e90776d1df25b 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-07  Richard Guenther  <rguenther@suse.de>
+
+       * fold-const.c (fold_unary_loc): Do not strip sign-changes
+       for NEGATE_EXPR.
+
 2011-07-07  Richard Guenther  <rguenther@suse.de>
 
        * tree-vrp.c (simplify_conversion_using_ranges): New function.
index e48aae9f4ce19a2ed7538194524b091603bff87e..44a8b6feaaa2cd4ddb1fabe713db785aa1526b05 100644 (file)
@@ -7561,7 +7561,7 @@ fold_unary_loc (location_t loc, enum tree_code code, tree type, tree op0)
   if (arg0)
     {
       if (CONVERT_EXPR_CODE_P (code)
-         || code == FLOAT_EXPR || code == ABS_EXPR)
+         || code == FLOAT_EXPR || code == ABS_EXPR || code == NEGATE_EXPR)
        {
          /* Don't use STRIP_NOPS, because signedness of argument type
             matters.  */
index 910a33368f699a126b16c9938cbd919730034357..1800d48f0f2975c685345ab7b7c8f578270e1c7a 100644 (file)
@@ -1,3 +1,7 @@
+2011-07-07  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/ftrapv-3.c: New testcase.
+
 2011-07-07  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/vrp58.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/ftrapv-3.c b/gcc/testsuite/gcc.dg/ftrapv-3.c
new file mode 100644 (file)
index 0000000..e23059a
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+/* { dg-options "-ftrapv" } */
+
+extern void abort (void);
+unsigned long
+foo (long i, long j)
+{
+  /* We may not fold this to (unsigned long)(i * j).  */
+  return -(unsigned long)(i * -j);
+}
+int main()
+{
+  if (foo (-__LONG_MAX__ - 1, -1) != -(unsigned long)(-__LONG_MAX__ - 1))
+    abort ();
+  return 0;
+}