]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.c (tree_expr_nonnegative_p): Handle *_DIV_EXPR, *_MOD_EXPR, SAVE_EXPR...
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Fri, 24 Aug 2001 12:18:45 +0000 (12:18 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Fri, 24 Aug 2001 12:18:45 +0000 (12:18 +0000)
* fold-const.c (tree_expr_nonnegative_p): Handle *_DIV_EXPR,
*_MOD_EXPR, SAVE_EXPR and NON_LVALUE_EXPR.

testsuite:
* gcc.dg/compare5.c: New testcase.

From-SVN: r45148

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

index ef1c8a94ebaf094fd75eead783e67fe159a13256..9d4ebaa79077621022dfa17a8f2c350cf4025e3f 100644 (file)
@@ -1,3 +1,8 @@
+2001-08-24  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * fold-const.c (tree_expr_nonnegative_p): Handle *_DIV_EXPR,
+       *_MOD_EXPR, SAVE_EXPR and NON_LVALUE_EXPR.
+
 2001-08-23  Jason Merrill  <jason_merrill@redhat.com>
 
        * c-pragma.h: Move weak_syms and weak_decls...
index 9b99c8f673438e2a9a0fd23c1be4f1aec2004a97..90d9f16b69e31a3146d3de9d2d6d7e4c283b9697 100644 (file)
@@ -7397,6 +7397,17 @@ tree_expr_nonnegative_p (t)
       return 1;
     case INTEGER_CST:
       return tree_int_cst_sgn (t) >= 0;
+    case TRUNC_DIV_EXPR:
+    case CEIL_DIV_EXPR:
+    case FLOOR_DIV_EXPR:
+    case ROUND_DIV_EXPR:
+      return tree_expr_nonnegative_p (TREE_OPERAND (t, 0))
+        && tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
+    case TRUNC_MOD_EXPR:
+    case CEIL_MOD_EXPR:
+    case FLOOR_MOD_EXPR:
+    case ROUND_MOD_EXPR:
+      return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
     case COND_EXPR:
       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1))
        && tree_expr_nonnegative_p (TREE_OPERAND (t, 2));
@@ -7412,6 +7423,10 @@ tree_expr_nonnegative_p (t)
       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
     case BIND_EXPR:
       return tree_expr_nonnegative_p (TREE_OPERAND (t, 1));
+    case SAVE_EXPR:
+      return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
+    case NON_LVALUE_EXPR:
+      return tree_expr_nonnegative_p (TREE_OPERAND (t, 0));
     case RTL_EXPR:
       return rtl_expr_nonnegative_p (RTL_EXPR_RTL (t));
       
index 5284f326607ea4cc5cb23665fe263098d188d64e..d79044b9aaf2f9add50921323d9f670088ad4fd0 100644 (file)
@@ -1,3 +1,7 @@
+2001-08-24  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * gcc.dg/compare5.c: New testcase.
+
 2001-08-23  Jason Merrill  <jason_merrill@redhat.com>
 
        * lib/prune.exp (prune_gcc_output): Also ignore "In constructor"
diff --git a/gcc/testsuite/gcc.dg/compare5.c b/gcc/testsuite/gcc.dg/compare5.c
new file mode 100644 (file)
index 0000000..f19c575
--- /dev/null
@@ -0,0 +1,41 @@
+/* Test for a bogus warning on comparison between signed and unsigned.
+   Origin: Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 8/21/2001.  */
+
+/* { dg-do compile } */
+/* { dg-options "-Wsign-compare" } */
+
+extern void bar(void);
+
+int foo(int x, int y, unsigned u)
+{
+  /* A *_DIV_EXPR is non-negative if both operands are.  */
+
+  if (u < ((x=-22)/33)) /* { dg-warning "signed and unsigned" "DIV_EXPR" } */
+    return x;
+
+  if (u < ((x=22)/33))
+    return x;
+
+  if (u < ((x=22)/(y=33)))
+    return x;
+
+  if (u < (((x&0x10000)?128:64) / ((y&0x10000)?8:4)))
+    return x;
+
+
+  /* A *_MOD_EXPR is non-negative if the first operand is.  */
+
+  if (u < ((x=-22)%33)) /* { dg-warning "signed and unsigned" "MOD_EXPR" } */
+    return x;
+
+  if (u < ((x=22)%-33))
+    return x;
+
+  if (u < ((x==y)%-33))
+    return x;
+
+  if (u < (((x=22)/33)%-33))
+    return x;
+
+  return 0;
+}