From 22e63bd346c056fb94086e0797eda465fbe7a7ac Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Fri, 26 Mar 2004 01:20:46 +0000 Subject: [PATCH] fold-const.c (tree_expr_nonnegative_p): Handle BIT_XOR_EXPR like BIT_IOR_EXPR... * fold-const.c (tree_expr_nonnegative_p): Handle BIT_XOR_EXPR like BIT_IOR_EXPR; A^B is nonnegative when A and B are nonnegative. * gcc.dg/compare8.c: Add an additional test for XOR. From-SVN: r79979 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 1 + gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/compare8.c | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c06551f69f9..c56fb86c02b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-03-25 Roger Sayle + + * fold-const.c (tree_expr_nonnegative_p): Handle BIT_XOR_EXPR like + BIT_IOR_EXPR; A^B is nonnegative when A and B are nonnegative. + 2004-03-25 Richard Henderson PR 11527 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e8c36f029ee..7fbbc8ec8b5 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8722,6 +8722,7 @@ tree_expr_nonnegative_p (tree t) return tree_expr_nonnegative_p (TREE_OPERAND (t, 1)) || tree_expr_nonnegative_p (TREE_OPERAND (t, 0)); case BIT_IOR_EXPR: + case BIT_XOR_EXPR: return tree_expr_nonnegative_p (TREE_OPERAND (t, 0)) && tree_expr_nonnegative_p (TREE_OPERAND (t, 1)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f16de2bd5a2..208a55f2770 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-03-25 Roger Sayle + + * gcc.dg/compare8.c: Add an additional test for XOR. + 2004-03-25 Kaveh R. Ghazi * gcc.dg/torture/builtin-ctype-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/compare8.c b/gcc/testsuite/gcc.dg/compare8.c index 6d0408564d8..d723c45a095 100644 --- a/gcc/testsuite/gcc.dg/compare8.c +++ b/gcc/testsuite/gcc.dg/compare8.c @@ -13,3 +13,9 @@ g(unsigned short a1, unsigned short a2, unsigned int b) return ((a1+a2)&5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */ } +int +h(unsigned short a1, unsigned short a2, unsigned int b) +{ + return ((a1+a2)^5) > b ? 2 : 3; /* { dg-bogus "signed and unsigned" } */ +} + -- 2.30.2