From b13ab42c86156992f0ee15fcf70dfb8cd05fca88 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Fri, 26 Apr 2002 19:35:33 +0000 Subject: [PATCH] tree.c (tree_int_cst_lt): Compare constants whose types differ in unsigned-ness correctly. * tree.c (tree_int_cst_lt): Compare constants whose types differ in unsigned-ness correctly. From-SVN: r52802 --- gcc/ChangeLog | 5 +++++ gcc/tree.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c87842e72e5..f23a4a4678b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-04-26 Alexandre Oliva + + * tree.c (tree_int_cst_lt): Compare constants whose types differ + in unsigned-ness correctly. + 2002-04-26 John David Anglin * pa.h (FUNCTION_OK_FOR_SIBCALL): Don't do sibcalls when using the diff --git a/gcc/tree.c b/gcc/tree.c index 450dd19cc04..4ec4bd04e86 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -3230,7 +3230,20 @@ tree_int_cst_lt (t1, t2) if (t1 == t2) return 0; - if (! TREE_UNSIGNED (TREE_TYPE (t1))) + if (TREE_UNSIGNED (TREE_TYPE (t1)) != TREE_UNSIGNED (TREE_TYPE (t2))) + { + int t1_sgn = tree_int_cst_sgn (t1); + int t2_sgn = tree_int_cst_sgn (t2); + + if (t1_sgn < t2_sgn) + return 1; + else if (t1_sgn > t2_sgn) + return 0; + /* Otherwise, both are non-negative, so we compare them as + unsigned just in case one of them would overflow a signed + type. */ + } + else if (! TREE_UNSIGNED (TREE_TYPE (t1))) return INT_CST_LT (t1, t2); return INT_CST_LT_UNSIGNED (t1, t2); -- 2.30.2