fold-const.c (range_binop): Take account of the bounded nature of fixed length arithmetic when...

h
	* fold-const.c (range_binop): Take account of the bounded nature
	of fixed length arithmetic when comparing unbounded ranges.

From-SVN: r25146
This commit is contained in:
Nathan Sidwell 1999-02-10 17:10:47 -07:00 committed by Jeff Law
parent 708bcaa7b1
commit d7b3ea38e0
1 changed files with 18 additions and 6 deletions

View File

@ -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 LT_EXPR: case LE_EXPR:
case NE_EXPR:
result = sgn0 != sgn1;
break;
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 ();
}