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) ...@@ -3009,21 +3009,33 @@ range_binop (code, type, arg0, upper0_p, arg1, upper1_p)
return 0; return 0;
/* Set SGN[01] to -1 if ARG[01] is a lower bound, 1 for upper, and 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 for neither. In real maths, we cannot assume open ended ranges are
and comparing bounds to non-bounds as above. */ 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); sgn0 = arg0 != 0 ? 0 : (upper0_p ? 1 : -1);
sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1); sgn1 = arg1 != 0 ? 0 : (upper1_p ? 1 : -1);
switch (code) switch (code)
{ {
case EQ_EXPR: case NE_EXPR: case EQ_EXPR:
result = (code == NE_EXPR); result = sgn0 == sgn1;
break; break;
case LT_EXPR: case LE_EXPR: case NE_EXPR:
result = sgn0 != sgn1;
break;
case LT_EXPR:
result = sgn0 < sgn1; result = sgn0 < sgn1;
break; break;
case GT_EXPR: case GE_EXPR: case LE_EXPR:
result = sgn0 <= sgn1;
break;
case GT_EXPR:
result = sgn0 > sgn1; result = sgn0 > sgn1;
break; break;
case GE_EXPR:
result = sgn0 >= sgn1;
break;
default: default:
abort (); 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