Commit d7b3ea38 by Nathan Sidwell Committed by Jeff Law

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
parent 708bcaa7
......@@ -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 ();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment