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
This commit is contained in:
Kaveh R. Ghazi 2000-12-19 01:17:20 +00:00 committed by Kaveh Ghazi
parent d0b6af711c
commit 9d2dc7da92
4 changed files with 74 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2000-12-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* fold-const.c (tree_expr_nonnegative_p): Treat truth values as
non-negative.
Tue Dec 19 00:37:08 2000 J"orn Rennecke <amylaar@redhat.com>
* reload.c (push_reload): When using a dying register for the reload

View File

@ -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;
}
}

View File

@ -1,3 +1,7 @@
2000-12-18 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/compare3.c: New test.
2000-12-18 Joseph S. Myers <jsm28@cam.ac.uk>
* gcc.dg/format-warnll-1.c: New test.

View File

@ -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<x)); /* { dg-bogus "signed and unsigned" "case 13" } */
y < (tf?64:(tf<x)); /* { dg-bogus "signed and unsigned" "case 14" } */
x < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 15" } */
y < (tf?(tf<x):64); /* { dg-bogus "signed and unsigned" "case 16" } */
x > (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" } */
}