]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2007-11-12 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Nov 2007 14:16:05 +0000 (14:16 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 12 Nov 2007 14:16:05 +0000 (14:16 +0000)
PR middle-end/34070
* fold-const.c (fold_binary): If testing for non-negative
operands with tree_expr_nonnegative_warnv_p make sure to
use op0 which has all (sign) conversions retained.

* gcc.c-torture/execute/pr34070-1.c: New testcase.
* gcc.c-torture/execute/pr34070-2.c: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130098 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr34070-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr34070-2.c [new file with mode: 0644]

index b95f35d96793607be7b00a48e35a1ec3b700ca8b..5b6c7306d5784a9e91196a176604332d172eba47 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-12  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34070
+       * fold-const.c (fold_binary): If testing for non-negative
+       operands with tree_expr_nonnegative_warnv_p make sure to
+       use op0 which has all (sign) conversions retained.
+
 2007-11-12  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/34027
index 5b81d88fd572b2fce7bc6473da551539e5976c52..0d6524e7fd285060c59aeaad81d1fe0d9025ad01 100644 (file)
@@ -11230,7 +11230,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
       strict_overflow_p = false;
       if (TREE_CODE (arg1) == LSHIFT_EXPR
          && (TYPE_UNSIGNED (type)
-             || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
+             || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
        {
          tree sval = TREE_OPERAND (arg1, 0);
          if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
@@ -11356,7 +11356,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
       strict_overflow_p = false;
       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
          && (TYPE_UNSIGNED (type)
-             || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p)))
+             || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
        {
          tree c = arg1;
          /* Also optimize A % (C << N)  where C is a power of 2,
index e22485905ac904a135010925d15530a3f6a0a2a7..15c5e93eeab7c7eef0f3981df87266cf24fc6c83 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-12  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34070
+       * gcc.c-torture/execute/pr34070-1.c: New testcase.
+       * gcc.c-torture/execute/pr34070-2.c: Likewise.
+
 2007-11-12  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/34027
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34070-1.c b/gcc/testsuite/gcc.c-torture/execute/pr34070-1.c
new file mode 100644 (file)
index 0000000..6589bb0
--- /dev/null
@@ -0,0 +1,13 @@
+extern void abort (void);
+
+int f(unsigned int x)
+{
+    return ((int)x) % 4;
+}
+
+int main()
+{
+  if (f(-1) != -1)
+    abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34070-2.c b/gcc/testsuite/gcc.c-torture/execute/pr34070-2.c
new file mode 100644 (file)
index 0000000..4c1ce7b
--- /dev/null
@@ -0,0 +1,13 @@
+extern void abort (void);
+
+int f(unsigned int x, int n)
+{
+    return ((int)x) / (1 << n);
+}
+
+int main()
+{
+  if (f(-1, 1) != 0)
+    abort ();
+  return 0;
+}