From 9d2dc7da92fe49bbe74ce104538cb307d57d5241 Mon Sep 17 00:00:00 2001 From: "Kaveh R. Ghazi" Date: Tue, 19 Dec 2000 01:17:20 +0000 Subject: [PATCH] fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative. * fold-const.c (tree_expr_nonnegative_p): Treat truth values as non-negative. testsuite: * gcc.dg/compare3.c: New test. From-SVN: r38374 --- gcc/ChangeLog | 5 +++ gcc/fold-const.c | 8 +++-- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.dg/compare3.c | 59 +++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/compare3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6932876158b..23c0eb5f38e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-12-18 Kaveh R. Ghazi + + * fold-const.c (tree_expr_nonnegative_p): Treat truth values as + non-negative. + Tue Dec 19 00:37:08 2000 J"orn Rennecke * reload.c (push_reload): When using a dying register for the reload diff --git a/gcc/fold-const.c b/gcc/fold-const.c index d8131faf226..a0a76b2d491 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7299,8 +7299,12 @@ tree_expr_nonnegative_p (t) return rtl_expr_nonnegative_p (RTL_EXPR_RTL (t)); default: - /* We don't know sign of `t', so be safe and return false. */ - return 0; + if (truth_value_p (TREE_CODE (t))) + /* Truth values evaluate to 0 or 1, which is nonnegative. */ + return 1; + else + /* We don't know sign of `t', so be conservative and return false. */ + return 0; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b60cda7515e..06c54bc3d1f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-12-18 Kaveh R. Ghazi + + * gcc.dg/compare3.c: New test. + 2000-12-18 Joseph S. Myers * gcc.dg/format-warnll-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/compare3.c b/gcc/testsuite/gcc.dg/compare3.c new file mode 100644 index 00000000000..eda3faf2754 --- /dev/null +++ b/gcc/testsuite/gcc.dg/compare3.c @@ -0,0 +1,59 @@ +/* Test for a bogus warning on comparison between signed and unsigned. + This was inspired by code in gcc. */ + +/* { dg-do compile } */ +/* { dg-options "-Wsign-compare" } */ + +int tf = 1; + +void f(int x, unsigned int y) +{ + /* Test comparing conditional expressions containing truth values. + This can occur explicitly, or e.g. when (foo?2:(bar?1:0)) is + optimized into (foo?2:(bar!=0)). */ + x > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 1" } */ + y > (tf?64:(tf!=x)); /* { dg-bogus "signed and unsigned" "case 2" } */ + x > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 3" } */ + y > (tf?(tf!=x):64); /* { dg-bogus "signed and unsigned" "case 4" } */ + + x > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 5" } */ + y > (tf?64:(tf==x)); /* { dg-bogus "signed and unsigned" "case 6" } */ + x > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 7" } */ + y > (tf?(tf==x):64); /* { dg-bogus "signed and unsigned" "case 8" } */ + + x > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 9" } */ + y > (tf?64:(tf>x)); /* { dg-bogus "signed and unsigned" "case 10" } */ + x > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 11" } */ + y > (tf?(tf>x):64); /* { dg-bogus "signed and unsigned" "case 12" } */ + + x < (tf?64:(tf (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 17" } */ + y > (tf?64:(tf>=x)); /* { dg-bogus "signed and unsigned" "case 18" } */ + x > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 19" } */ + y > (tf?(tf>=x):64); /* { dg-bogus "signed and unsigned" "case 20" } */ + + x > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 21" } */ + y > (tf?64:(tf<=x)); /* { dg-bogus "signed and unsigned" "case 22" } */ + x > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 23" } */ + y > (tf?(tf<=x):64); /* { dg-bogus "signed and unsigned" "case 24" } */ + + x > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 25" } */ + y > (tf?64:(tf&&x)); /* { dg-bogus "signed and unsigned" "case 26" } */ + x > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 27" } */ + y > (tf?(tf&&x):64); /* { dg-bogus "signed and unsigned" "case 28" } */ + + x > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 29" } */ + y > (tf?64:(tf||x)); /* { dg-bogus "signed and unsigned" "case 30" } */ + x > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 31" } */ + y > (tf?(tf||x):64); /* { dg-bogus "signed and unsigned" "case 32" } */ + + x > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 33" } */ + y > (tf?64:(!tf)); /* { dg-bogus "signed and unsigned" "case 34" } */ + x > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 35" } */ + y > (tf?(!tf):64); /* { dg-bogus "signed and unsigned" "case 36" } */ + +} -- 2.30.2