diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-11 00:10:47 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-02-11 00:10:47 +0000 |
commit | 621ba3966f49b8a055ae2260c5b11e7c5516fd43 (patch) | |
tree | 96b65a6ab40550d6a17f0bdc1614cb3c1934aa5e /gcc/fold-const.c | |
parent | b0a0a3fe55220d10ecdc930abe2938bc94071130 (diff) | |
download | gcc-621ba3966f49b8a055ae2260c5b11e7c5516fd43.tar.gz |
h
* fold-const.c (range_binop): Take account of the bounded nature
of fixed length arithmetic when comparing unbounded ranges.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@25146 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 9b17374f80b..0dbce12b22f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3009,21 +3009,33 @@ range_binop (code, type, arg0, upper0_p, arg1, upper1_p) return 0; /* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 0 - for neither. Then compute our result treating them as never equal - and comparing bounds to non-bounds as above. */ + for neither. In real maths, we cannot assume open ended ranges are + the same. But, this is computer arithmetic, where numbers are finite. + We can therefore make the transformation of any unbounded range with + the value Z, Z being greater than any representable number. This permits + us to treat unbounded ranges as equal. */ sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1); sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1); switch (code) { - case EQ_EXPR: case NE_EXPR: - result = (code == NE_EXPR); + case EQ_EXPR: + result = sgn0 == sgn1; + break; + case NE_EXPR: + result = sgn0 != sgn1; break; - case LT_EXPR: case LE_EXPR: + case LT_EXPR: result = sgn0 < sgn1; break; - case GT_EXPR: case GE_EXPR: + case LE_EXPR: + result = sgn0 <= sgn1; + break; + case GT_EXPR: result = sgn0 > sgn1; break; + case GE_EXPR: + result = sgn0 >= sgn1; + break; default: abort (); } |